您的位置:首页 > 编程语言 > Go语言

1460 Heavy Cargo 最短路径 Dijkstra 变形

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

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

[cpp] view
plaincopyprint?

#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;

}


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: