UVa 10099 The Tourist Guide

来源:互联网 发布:网络无法连接有个叹号 编辑:程序博客网 时间:2024/05/29 17:57

求两点之间所有路径中最小单元间距的最大值,既可以仿照UVa10048用kruskal最大生成树的原理求,又可以用Floyd算法求。

代码如下(Floyd算法):

#include <iostream>#include <cstring>#include <cstdlib>#include <cstdio>#include <cmath>using namespace std;int vis[101][101];const int INF = 1000003;void floyd(int n){    for(int k=1; k<=n; k++)        for(int i=1; i<=n; i++)            for(int j=1; j<=n; j++)                vis[i][j] = max(vis[i][j],min(vis[i][k], vis[k][j]));}int main(){#ifdef test    freopen("sample.txt", "r", stdin);#endif    int n, r, x, y, w;    int start, end, cas = 0, mod;    while(scanf("%d%d", &n, &r))    {        if(!n && !r)            break;        memset(vis, 0, sizeof(vis));        for(int i=0; i<r; i++)        {            scanf("%d%d%d", &x, &y, &w);            vis[y][x] = vis[x][y] = w;        }        scanf("%d%d%d", &start, &end, &w);        floyd(n);        printf("Scenario #%d\n", ++cas);        mod = 0;        if(w % (vis[start][end]-1))            mod = 1;        printf("Minimum Number of Trips = %d\n", w / (vis[start][end]-1) + mod);//每一趟最多只能运 max_val-1 个人,因为导游每次还要站一个位置        puts("");    }    return 0;}