poj 1797 Heavy Transportation

题意:

一条通路上的承重定义为这条通路上经过的所有路径承重的最小值,要去求从1到N的所有通路中的最大承重

dijstra 

每次收录最大承重的点 

更新条件为、

dist[i] = max( dist[i], min( Max, G[MaxV][i] ) );

#include <iostream>
#include <memory.h>
#include <string>
#include <stdio.h>
#include <algorithm>
#include <math.h>
#define IN (1<<28)
using namespace std;
int N, kase, M;
int G[1010][1010], dist[100005], visited[100005];//dist[i]是所有通路中的最大
void Dij()
{
    for( int i = 1; i <= N; i++ )
        dist[i] = G[1][i];
    visited[1] = 1;
    for( int cnt = 1; cnt < N; cnt++ )
    {
        int MaxV = 0, Max = 0;
        for( int i = 1; i <= N; i++ )
        {
            if( !visited[i] && dist[i] > Max )
            {
                MaxV = i;
                Max = dist[i];
            }
        }
        if( !MaxV )
            break;
        visited[MaxV] = 1;
        for( int i = 1; i <= N; i++ )
        {
            if( !visited[i] )
            {
                dist[i] = max( dist[i], min( Max, G[MaxV][i] ) );
            }
        }
    }
}
void OutPut( int num )
{
    printf("Scenario #%d:\n", num);
    printf("%d\n\n", dist[N]);
}
int main()
{
    scanf("%d", &kase);
    for( int k = 1; k <= kase; k++ )
    {
        scanf("%d %d", &N, &M);
        memset(G, 0, sizeof(G));
        memset(dist, 0, sizeof(dist));
        memset(visited, 0, sizeof(visited));
        for( int i = 1; i <= N; i++ )
            for( int j = 1; j <= N; j++ )
        {
            if( i==j )
                G[i][j] = IN;
            else
                G[i][j] = 0;
        }
        while( M-- )
        {
            int src,des,len;
            scanf("%d %d %d", &src, &des, &len);
            G[src][des] = len;
            G[des][src] = len;
        }
        Dij();
        OutPut(k);
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/xutian_curry/article/details/80231255