1460 Heavy Cargo 最短路径 Dijkstra 变形


题意:有一个卡车公司能生产非常大的卡车,卡车打的足以装下任何大小和重量的货物;现在 要用这卡车 运送货物, 从城市A运送到城市B,城市与城市之间的道路构成一个 无向图, 道路有最大的承受重量,请选择 运送的路径 输出 能卡车 最多可以装载多少货物;

思路:应该是网络流的题目,不过 用Dijkstra也可以解, 利用Dijkstra算法 求出每条路径的最小装载,然后在这些最小装载中 找到最大的一个;

  1. #include <iostream>  
  2. using namespace std;  
  3. char name[201][50];  
  4. int w[201][201],dis[201];  
  5. int sum,n,r;  
  6. int getnum(char t[])  
  7. {  
  8.     for(int i=0; i<=sum; i++)  
  9.     if(!strcmp(name[i], t))  
  10.         return i;  
  11.     sum++;  
  12.     strcpy(name[sum], t);  
  13.     return sum;  
  14. }  
  15. int Dijkstra(int s, int e)  
  16. {  
  17.     int i,j,t,minw;  
  18.     bool flag[201]={0};  
  19.     for(i=0; i<n; i++)  
  20.         dis[i] = w[s][i];  
  21.     dis[s]=0; flag[s]=true;  
  22.     for(i=0; i<n; i++)  
  23.     {  
  24.         minw = dis[e]; t = s;  
  25.         for(j=0; j<n; j++)  
  26.         if(dis[j]>minw && !flag[j])  
  27.         {  
  28.             t = j;  
  29.             minw = dis[j];  
  30.         }  
  31.         if(flag[t]) return dis[e];  
  32.         flag[t] = true;  
  33.         for(j=0; j<n; j++)  
  34.         if(!flag[j] && w[t][j]>-1)  
  35.         {  
  36.             minw = dis[t]>w[t][j]?w[t][j]:dis[t];  
  37.             dis[j] = dis[j]<minw?minw:dis[j];  
  38.         }  
  39.     }  
  40.     return dis[e];  
  41. }  
  42. int main()  
  43. {  
  44.     int i,weight,s,e,Case=0;  
  45.     char a[50],b[50];  
  46.     while(scanf("%d %d%*c", &n, &r),n+r)  
  47.     {  
  48.         memset(w,-1,sizeof(w));  
  49.         memset(name,'\0',sizeof(name));  
  50.         sum=-1;  
  51.         for(i=0; i<r; i++)  
  52.         {  
  53.             scanf("%s %s %d", &a, &b, &weight);  
  54.             s = getnum(a); e = getnum(b);  
  55.             w[s][e]=w[e][s]=weight;  
  56.         }  
  57.         scanf("%s %s", &a, &b);  
  58.         s = getnum(a); e = getnum(b);  
  59.         printf("Scenario #%d\n%d tons\n\n",++Case, Dijkstra(s,e));  
  60.     }  
  61.     return 0;  
  62. }  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值