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