您的位置:首页 > 产品设计 > UI/UE

UVA 10099 - The Tourist Guide

2011-11-28 20:08 411 查看
这道题要使游客从一个点到另一个点,求最小的趟数,我们用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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: