码迷,mamicode.com
首页 > 其他好文 > 详细

poj3615 最短路

时间:2015-07-19 21:22:59      阅读:112      评论:0      收藏:0      [点我收藏+]

标签:

问题:

牛要跨过一些障碍,希望以最小的体力跨过障碍,并且对于一条路径,只在乎其中最高的障碍。

输入N代表站点数,标记为1—N,输入M代表路径数,从站点S到E之间需要跨过高度为H的障碍。

输入T代表牛要完成的任务数。对于每个任务,输入A,B,输出一条从站点A到B的路径,使需要跨过的最高障碍为最低。

题解:

变形的Floyd。

/*******************************************
Problem: 3615		User: 
Memory: 960K		Time: 688MS
Language: G++		Result: Accepted
********************************************/
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;

const int INF = 0x3f3f3f3f;
const int N = 305;

int mp[N][N];
int dis[N], vis[N];

void floyd(int n)
{
    int i, j, k;
    for (k = 1; k <= n; ++k)
        for (i = 1; i <= n; ++i)
            for (j = 1; j <= n; ++j)
            if (mp[i][j] > max(mp[i][k] , mp[k][j]))
                mp[i][j] = max(mp[i][k], mp[k][j]);
}

int main()
{
    int n, m, t;
    while (scanf("%d%d%d", &n, &m, &t) != EOF) {
        int i, j;
        int a, b, h;
        for (i = 1; i <= n; ++i)
            for (j = 1; j <= n; ++j)
                mp[i][j] = INF;
        for (i = 0; i < m; ++i) {
            scanf("%d%d%d", &a, &b, &h);
            mp[a][b] = h;
        }
        floyd(n);
        for (i = 0; i < t; ++i) {
            scanf("%d%d", &a, &b);
            printf("%d\n", mp[a][b] == INF ? -1 : mp[a][b]);
        }
    }
    return 0;
}

  

poj3615 最短路

标签:

原文地址:http://www.cnblogs.com/wenruo/p/4659494.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!