uva 10099【The Tourist Guide】

忠诚的告诉大家:uva上的题目一定要看清楚格式啊,格式错误也是WA啊,~~~~(>_<)~~~~ 因为一个换行符WA了几次。。。

Dijkstra的变形。。。求一条路上的最小值然后取多条路中的最大值。。。

代码如下:
 1 #include <cstdio>
 2 #include <cstring>
 3 #include <algorithm>
 4 
 5 int g[110][110];
 6 int v[110],d[110];
 7 int N,R;
 8 int start,end,per;
 9 int cas;
10 
11 bool init()
12 {
13     scanf("%d%d",&N,&R);
14     if(N == 0&&R == 0)
15         return false;
16 
17     memset(v,false,sizeof(v));
18     memset(g,-1,sizeof(g));
19 
20     for(int i = 0;i < R;i ++)
21     {
22         int a,b,w;
23         scanf("%d%d%d",&a,&b,&w);
24         g[a][b] = g[b][a] = w;
25         g[a][a] = g[b][b] = 0;
26     }
27     scanf("%d%d%d",&start,&end,&per);
28 
29     return true;
30 }
31 
32 void solve()
33 {
34     memset(d,-1,sizeof(d));
35     d[start] = 0;
36 
37     for(int i = 1;i <= N;i ++)
38     {
39         int x = 0,k;
40         for(int j = 1;j <= N;j ++)
41         {
42             if(!v[j] && d[j] > -1&&d[j] >= x)
43             {
44                 x = d[k = j];
45             }
46         }
47 
48         v[k] = true;
49         for(int j = 1;j <= N;j ++)
50         {
51             if(k == start)
52             {
53                 d[j] = g[k][j];
54             }
55             else
56                 if(g[k][j] > -1&&j != k)
57                 {
58                     int t = std::min(x,g[k][j]);
59 
60                     d[j] = std::max(d[j],t);
61                 }
62         }
63     }
64 
65     int ans = (per%(d[end]-1) == 0?per/(d[end]-1):(per/(d[end]-1) + 1));
66     printf("Scenario #%d\nMinimum Number of Trips = %d\n\n",cas ++,ans);
67 }
68 
69 int main()
70 {
71     cas = 1;
72     while(init())
73     {
74         solve();
75     }
76 
77     return 0;
78 }

 

转载于:https://www.cnblogs.com/Shirlies/archive/2012/04/17/2454203.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值