IT民工
加油!

这道题要使游客从一个点到另一个点,求最小的趟数,我们用floyd算法将所有路径中的最小边的

最大值求出来,然后用计算trips就行了。求最小边的最大值的方程为:

d[i][j]=max{d[i][j],min{d[i][k],d[k][j]}}

初始化:所有 d[i][j]=0;

 

#include<stdio.h>
#define MAXD 110

int u, v, w, S, D, T, R, N;
int d[MAXD][MAXD];

int min( int a, int b)
{
return a < b ? a : b;
}

void init()
{
for( int i = 1; i <= N; i ++)
for( int j = 1; j <= N; j ++)
d[i][j] = 0;
for( int i = 1; i <= R; i ++)
{
scanf( "%d%d%d", &u ,&v, &w);
d[u][v] = d[v][u] = w;
}
}

void floyd()
{
for( int k = 1; k <= N; k ++)
for( int i = 1; i <= N; i ++)
for( int j = 1; j <= N; j ++)
if( min(d[i][k], d[k][j]) > d[i][j])
d[i][j] = min( d[i][k], d[k][j]);
}

int main()
{
int cas = 0;
while( true)
{
scanf( "%d%d", &N, &R);
if( N == 0 && R == 0) break;
init();
floyd();
scanf( "%d%d%d", &S, &D, &T);
int ans;
ans = T / (d[S][D] - 1);
if( T % (d[S][D] - 1) != 0)
ans++;
printf("Scenario #%d\n", ++cas);
printf("Minimum Number of Trips = %d\n", ans);
printf("\n");
}
return 0;
}


posted on 2011-11-28 20:08  找回失去的  阅读(241)  评论(0编辑  收藏  举报