poj 1797 Heavy Transportation(Dijkstar变形)

http://poj.org/problem?id=1797

 

给定n个点,及m条边的最大负载,求顶点1到顶点n的最大载重量。
用Dijkstra算法解之,只是需要把“最短路”的定义稍微改变一下,
A到B的路长定义为路径上边权最小的那条边的长度,
而最短路其实是A到B所有路长的最大值。


#include<stdio.h>
#include<string.h>
#include<math.h>
#include<stdlib.h>
#include<algorithm>
#define N 1010
#define INF 0x3f3f3f3f

using namespace std;

int G[N][N], dist[N];
bool vis[N];
int n;

void Init()
{
    int i;
    memset(vis, false, sizeof(vis));
    for(i = 1 ; i <= n ; i++)
        dist[i] = G[1][i];//dist[i]表示从起点到i点的载重量
}

int Dij(int Start, int End)
{
    int Max, i, j, index;
    dist[Start] = 0;
    for(i = 1 ; i <= n ; i++)
    {
        Max = 0;
        for(j = 1 ; j <= n; j++)
        {
            if(!vis[j] && Max < dist[j])
            {
                Max = dist[j];
                index = j;
            }
        }//找最大载重量
        vis[index] = true;
        for(j = 1 ; j <= n ; j++)
        {
            if(!vis[j] && dist[j] < min(dist[index], G[index][j]))
               dist[j] = min(dist[index], G[index][j]);
        }
    }
    return dist[End];
}

int main()
{
    int m, a, b, c, t, x = 0;
    scanf("%d", &t);
    while(t--)
    {
        x++;
        memset(G, 0, sizeof(G));
        scanf("%d%d", &n, &m);
        while(m--)
        {
            scanf("%d%d%d", &a, &b, &c);
            G[a][b] = G[b][a] = c;
        }
        Init();
        printf("Scenario #%d:\n%d\n\n", x, Dij(1, n));
    }
    return 0;
}

 

posted @ 2015-08-20 09:33  午夜阳光~  阅读(161)  评论(0编辑  收藏  举报