题意:有一个卡车公司能生产非常大的卡车,卡车打的足以装下任何大小和重量的货物;现在 要用这卡车 运送货物, 从城市A运送到城市B,城市与城市之间的道路构成一个 无向图, 道路有最大的承受重量,请选择 运送的路径 输出 能卡车 最多可以装载多少货物;
思路:应该是网络流的题目,不过 用Dijkstra也可以解, 利用Dijkstra算法 求出每条路径的最小装载,然后在这些最小装载中 找到最大的一个;
- #include <iostream>
- using namespace std;
- char name[201][50];
- int w[201][201],dis[201];
- int sum,n,r;
- int getnum(char t[])
- {
- for(int i=0; i<=sum; i++)
- if(!strcmp(name[i], t))
- return i;
- sum++;
- strcpy(name[sum], t);
- return sum;
- }
- int Dijkstra(int s, int e)
- {
- int i,j,t,minw;
- bool flag[201]={0};
- for(i=0; i<n; i++)
- dis[i] = w[s][i];
- dis[s]=0; flag[s]=true;
- for(i=0; i<n; i++)
- {
- minw = dis[e]; t = s;
- for(j=0; j<n; j++)
- if(dis[j]>minw && !flag[j])
- {
- t = j;
- minw = dis[j];
- }
- if(flag[t]) return dis[e];
- flag[t] = true;
- for(j=0; j<n; j++)
- if(!flag[j] && w[t][j]>-1)
- {
- minw = dis[t]>w[t][j]?w[t][j]:dis[t];
- dis[j] = dis[j]<minw?minw:dis[j];
- }
- }
- return dis[e];
- }
- int main()
- {
- int i,weight,s,e,Case=0;
- char a[50],b[50];
- while(scanf("%d %d%*c", &n, &r),n+r)
- {
- memset(w,-1,sizeof(w));
- memset(name,'\0',sizeof(name));
- sum=-1;
- for(i=0; i<r; i++)
- {
- scanf("%s %s %d", &a, &b, &weight);
- s = getnum(a); e = getnum(b);
- w[s][e]=w[e][s]=weight;
- }
- scanf("%s %s", &a, &b);
- s = getnum(a); e = getnum(b);
- printf("Scenario #%d\n%d tons\n\n",++Case, Dijkstra(s,e));
- }
- return 0;
- }