题目描述:
道路x->y之间的权值表示允许容量。求从1出发,到达n点的最大允许通过容量为多少。(注意:为无向图)
解题思路:
做一次迪杰斯特拉。D[i]存1->i的允许通过的容量值。每次选择容量最大的点,选进下一个点后更新点:D[j] = max(D[j], min(D[选择的点], G[选择的点][j]))。更新到n点即可成功退出。若未更新到n点,却发现找不到容量大于0的路,直接退出输出0。
时间复杂度为O(v2)
代码:
#include <stdio.h>
#include <stdlib.h>
#define N 1001
int G[N][N];
int D[N], final[N];
int max_num(int x, int y)
{
if(x>y)
return x;
else
return y;
}
int min_num(int x,int y)
{
if(x<y)
return x;
else
return y;
}
main()
{
int scenario;
int max,tmp,i,j,s,n,m,x,y,temp;
scanf("%d", &scenario);
for(s=1;s<=scenario;s++)
{
scanf("%d %d",&n, &m);
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
G[i][j] = 0;
for(i=1;i<=m;i++)
{
scanf("%d %d", &x, &y);
scanf("%d",&G[x][y]);
G[y][x] = G[x][y];
}
//initial
for(i=1;i<=n;i++)
{
D[i] = G[1][i];
final[i] = 0;
}
final[1] = 1;
//执行寻找最大容量
for(i=2;i<=m;i++)
{
max = -1;
tmp = 0;
for(j=2;j<=n;j++)
if(!final[j])
if(max < D[j])
{
tmp = j;
max = D[j];
}
if(tmp == n)
{
D[n] = max;
final[n] = 1;
break;
}
if(max == 0)
break;
final[tmp] = 1;
for(j=2;j<=n;j++)
if(!final[j])
D[j] = max_num(D[j], min_num(D[tmp], G[tmp][j]));
}
printf("Scenario #%d:\n",s);
printf("%d\n\n",D[n]);
}
//system("pause");
return 0;
}