版权声明:转载请附上地址 https://blog.csdn.net/weixin_44574520/article/details/89599813
luogu 1576
题目分析:
反起跑spfa,算出费用
Code:
#include <bits/stdc++.h>
using namespace std;
#define maxn 2010
#define maxm 100010
int A,B,cnt,n,m,vis[maxn],head[maxn];
double d[maxn];
struct node {
int u,v,nxt;
double w;
}e[maxm<<1];
inline void init_() {
freopen("a.txt","r",stdin);
}
inline int read_() {
int x=0,f=1;
char c=getchar();
while(c<'0'||c>'9') {
if(c=='-') f=-1;
c=getchar();
}
while(c>='0'&&c<='9') {
x=x*10+c-'0';
c=getchar();
}
return x*f;
}
inline void clean_() {
memset(vis,0,sizeof(vis));
memset(head,-1,sizeof(head));
cnt=0;
}
inline void add_(int u,int v,double w) {
e[++cnt].u=u;
e[cnt].v=v;
e[cnt].w=w;
e[cnt].nxt=head[u];
head[u]=cnt;
}
inline void readda_() {
clean_();
n=read_();m=read_();
int x,y;double z;
for(int i=1;i<=m;i++) {
x=read_();y=read_();scanf("%lf",&z);
add_(x,y,z);add_(y,x,z);
}
A=read_();B=read_();
}
inline void SPFA_() {
for(int i=1;i<=n;i++) d[i]=999999999;
deque<int >q;
int S=B,T=A;
q.push_back(S);
vis[S]=1;
d[S]=100;
while(!q.empty()) {
int u=q.front();
q.pop_front();
vis[u]=0;
for(int i=head[u];~i;i=e[i].nxt) {
int v=e[i].v,w=e[i].w;
double pp=w;
pp/=100.0;
pp=1.0-pp;
if(d[v]>d[u]/pp) {
d[v]=d[u]/pp;
if(!vis[v]) {
if(!q.empty()&&d[v]<d[q.front()]) {
q.push_front(v);
vis[v]=1;
}
else {
q.push_back(v);
vis[v]=1;
}
}
}
}
}
}
inline void work_() {
SPFA_();
printf("%.8lf",d[A]);
}
int main() {
init_();
readda_();
work_();
return 0;
}