#include<stdio.h>
#define N 1010
int map[N][N],d[N],n,visted[N];
int min(int x,int y)
{
if(x<y)
return x;
return y;
}
void Dij()
{
int i,j,index,max;
for(i=1;i<=n;i++)
{
d[i]=map[1][i];
visted[i]=0;
}
visted[1]=1;
for(i=1;i<n;i++)
{
max=0;
for(j=1;j<=n;j++)
if( !visted[j] && d[j]>max)
{
index=j;
max=d[j];
}
visted[index]=1;
for(j=1;j<=n;j++)
{
if( !visted[j] && map[index][j] && min(d[index],map[index][j])>d[j] )
{
d[j]=min(d[index],map[index][j]);
}
}
}
printf("%d\n\n",d[n]);
return ;
}
int main()
{
int t,i,j,x,y,w,k,m;
scanf("%d",&t);
for(i=1;i<=t;i++)
{
scanf("%d%d",&n,&m);
if(n==1)
{
printf("0\n\n");
continue;
}
for(j=0;j<=n;j++)
for(k=0;k<=n;k++)
map[j][k]=0;
for(j=1;j<=m;j++)
{
scanf("%d%d%d",&x,&y,&w);
map[x][y]=map[y][x]=w;
}
printf("Scenario #%d:\n",i);
Dij();
}
return 0;
}
我用dijkstra 做的,错了不少次,最后发现初始化是出现错误。
大致题意:求s到t的可行路径上最小值的最大值(有点拗口啊)也就是说从s到t的每一条可行路径上都有一条最小值,有多条路径的话就求这些最小值的最大值。
思路:用求最短路的方法来求解,我们可以把flow[]数组用于存储源点到当前点的可行的最大载重量,假如a->b权值为c的话,怎么改松弛条件呢?k=(flow[a]<c) ? flow[a] : c; if(flow[b]<k) flow[b]=k;这就保证了到达某个点的最大载重量。
916

被折叠的 条评论
为什么被折叠?



