加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

POJ PKU 3615 Floyd

(2010-05-04 17:51:27)
标签:

poj

pku

3615

it

分类: 图论

题目描述:

给你n个站,有m条边,每条边有一个耗费值。

问你如果A站到B站可通,选一条路,求路径上的相邻两站的耗费值的最大值,让这个值最小,输出。

否则输出-1.

解题报告:

Floyd算法。

松弛条件改一下即可:

if(map[i][j]>max(map[i][k],map[k][j]))map[i][j]=max(map[i][k],map[k][j]);

代码如下:

#include<iostream>
using namespace std;
int n, m, t, a, b, c, x[301][301];
int main()
{
    scanf("%d%d%d", &n, &m, &t);
    memset(x, -1, sizeof(x));
    while(m--)
    {
        scanf("%d%d%d", &a, &b, &c);
        if (x[a][b] == -1 || c < x[a][b]) x[a][b] = c;
    }
    for(int k = 1; k <= n; k )
        for(int i = 1; i <= n; i )
            for(int j = 1; j <= n; j )
            {
                if (x[i][k] == -1 || x[k][j] == -1)
                    continue;
                int mmax = (x[i][k] > x[k][j] ? x[i][k] : x[k][j]);
                if (x[i][j] == -1 || (x[i][j] > mmax))
                    x[i][j] = mmax;
            }
    while(t--)
    {
        scanf("%d%d", &a, &b);
        printf("%d\n", x[a][b]);
    }
    return 0;
}

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有