代码改变世界

1937. 导游

2011-05-14 22:36  Min·zc  阅读(143)  评论(0编辑  收藏  举报
 1 /*大概就是在两点间最短路径的基础上的一点修改
 2  *求出两点间的单路径最大流
 3  *需要注意的是导游必须在车上,所以会占掉一个乘客的位置
 4  *在最后进行计算时要将导游的位置减掉
 5  *
 6  *
 7  *
 8  *
 9  *
10  *
11  *
12  */
13 
14 #include <iostream>
15 #include <memory.h>
16 #include <queue>
17 #include <math.h>
18 using namespace std;
19 int rd[110][110];
20 int vi[110];
21 int fl[110];
22 int c,n,s,e,d;
23 int ans;
24 void sol()
25 {
26         int tem=0;
27         vi[s]=1;
28         for(int i=1;i<=c;i++)
29                 if(rd[s][i]!=0)
30                         fl[i]=rd[s][i];
31         for(int i=1;i<c;i++)
32         {
33                 int max=0;
34                 int p,f;
35                 for(int j=1;j<=c;j++)
36                 {
37                         if(vi[j]==0&&max<=fl[j])
38                         {
39                                 max=fl[j];
40                                 p=j;
41                         }
42                 }
43                 fl[p]=max;
44                 vi[p]=1;
45         //     cout<<"p "<<p<<endl;
46 
47                 for(int j=1;j<=c;j++)
48                         if(vi[j]==0&&rd[p][j]!=0)
49                         {
50                                 max=fl[p];
51                                 if(rd[p][j]<fl[p])
52                                         max=rd[p][j];
53         //                     cout<<"j:"<<j<<" : "<<max<<endl;
54                                 if(fl[j]<max)
55                                         fl[j]=max;
56                         }
57         //     for(int j=1;j<=c;j++)
58         //             cout<<fl[j]<<" ";
59         //     cout<<endl;
60         }
61 }
62 int main()
63 {
64         int t;
65         cin>>t;
66         while(t--)
67         {
68                 memset(vi,0,sizeof(vi));
69                 memset(rd,0,sizeof(rd));
70                 memset(fl,0,sizeof(fl));
71         
72                 cin>>c>>n;
73                 while(n--)
74                 {
75                         int a,b,e;
76                         cin>>a>>b>>e;
77                         rd[a][b]=e;
78                         rd[b][a]=e;
79                 }
80                 cin>>s>>e>>d;
81                 sol();
82         //     for(int i=1;i<=c;i++)
83         //             cout<<fl[i]<<" ";
84         //     cout<<endl;
85         //     cout<<fl[e]<<endl;
86                 int an=ceil((double)(double)d/(double)(fl[e]-1));
87                 cout<<an<<endl;
88         }
89 }