http://acm.hdu.edu.cn/showproblem.php?pid=4318
这题做的好二 不会邻接表ME了一晚上 学会了邻接表 TLE了一晚上 看了最短路径WA了一上午 原来样例中用的100 我就直接写的100.。。。
14次换来一次AC
单元最短路径
http://www.cnblogs.com/zen_chou/archive/2009/05/15/1457962.html
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #include<stdio.h> 2 #include<string.h> 3 #include<iostream> 4 #include<queue> 5 using namespace std; 6 int f[50001]; 7 double s[50001],s1; 8 struct node 9 { 10 int w, u,v,next; 11 }men[2500001]; 12 int first[50001],t; 13 void init() 14 { 15 t = 0; 16 memset(first,-1,sizeof(first)); 17 } 18 void add(int u,int v,int w) 19 { 20 men[t].u = u; 21 men[t].v = v; 22 men[t].w = w; 23 men[t].next = first[u]; 24 first[u] = t; 25 t++; 26 } 27 void spfa(int n,int st) 28 { 29 int i,j,max,k; 30 memset(f,0,sizeof(f)); 31 for(i = 1; i <= n ; i++) 32 s[i] = -1; 33 queue<int> q; 34 f[st] = 1; 35 q.push(st); 36 s[st] = s1; 37 while(!q.empty()) 38 { 39 k = q.front(); 40 q.pop(); 41 f[k] = 0; 42 for(i = first[k] ; i!=-1 ; i = men[i].next) 43 { 44 if(s[k]*men[i].w/100>s[men[i].v]) 45 { 46 s[men[i].v] = s[k]*men[i].w/100; 47 if(!f[men[i].v]) 48 { 49 q.push(men[i].v); 50 f[men[i].v] = 1; 51 } 52 } 53 } 54 } 55 } 56 int main() 57 { 58 int t1,n,i,j,k,z,a1,a2,g,x; 59 while(cin>>t1) 60 { 61 init(); 62 memset(men,0,sizeof(men)); 63 for(i = 1 ;i <= t1 ; i++) 64 { 65 cin>>n; 66 for(j = 1 ; j <= n ; j++) 67 { 68 cin>>x>>z; 69 add(i,x,100-z); 70 } 71 } 72 cin>>a1>>a2>>s1; 73 if(a1==a2) 74 { 75 printf("0.00\n"); 76 continue; 77 } 78 spfa(t1,a1); 79 if(s[a2]>=0) 80 printf("%.2lf\n",s1-s[a2]); 81 else 82 printf("IMPOSSIBLE\n"); 83 } 84 return 0; 85 }