http://acm.hdu.edu.cn/showproblem.php?pid=4318
很裸的spfa
#include<iostream> #include<cstdio> #include<algorithm> #include<cstring> #include<cmath> #include<map> #include<queue> #include<cmath> #define LL long long using namespace std; const int N=50040; const double M=200000000.0; struct node { struct tt *next; }mem[N]; struct tt { struct tt *next; int j; int k; }; void build(int i,int j,int k) { struct tt *t=new tt; t->j=j; t->k=k; t->next=mem[i].next; mem[i].next=t; } void Dele(int n) { for(int i=1;i<=n;++i) { mem[i].next=NULL; } } int n; double dist[N]; void spfa(int st,int nd,double power) { for(int i=1;i<=n;++i) { if(i==st) dist[i]=power; else dist[i]=-1.0; } bool in[N]; memset(in,false,sizeof(in)); queue<int>str; in[st]=true; str.push(st); struct tt *t; while(!str.empty()) { int x=str.front(); in[x]=false; str.pop(); t=mem[x].next; while(t!=NULL) { if(dist[x]*(t->k)/100.0>dist[t->j]) { dist[t->j]=dist[x]*(t->k)/100.0; if(!in[t->j]) { in[t->j]=true; str.push(t->j); } } t=t->next; } } } int main() { //freopen("data.txt","r",stdin); while(scanf("%d",&n)!=EOF) { for(int i=1;i<=n;++i) { int j,k,w; scanf("%d",&w); while(w--) { scanf("%d %d",&j,&k); build(i,j,100-k); } } int st,nd; double power; scanf("%d %d %lf",&st,&nd,&power); if(st==nd) { printf("0.00\n"); continue; } spfa(st,nd,power); if(dist[nd]<0.0) printf("IMPOSSIBLE!\n"); else { printf("%.2lf\n",power-dist[nd]); } Dele(n); } return 0; }