1937. 导游

 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 }

转载于:https://www.cnblogs.com/congzc/archive/2011/05/14/2329967.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值