hdu4318Power transmission(单源最短路径)多校二

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

View Code
 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 }

 

posted @ 2012-08-02 10:10  _雨  阅读(188)  评论(0编辑  收藏  举报