Poj(1797) Dijkstra对松弛条件的变形

题目链接:http://poj.org/problem?id=1797

题意:从路口1运货到路口n,最大的运货重量是多少?题目给出两路口间的最大载重。

思路:j加到s还是接到K下面,取两者的较大者,而使得载重量较大,而接到k下面,载重量是dis[k]和maps[k][j]的较小者。

#include <stdio.h>
#include <string.h>
#include <algorithm>

using namespace std;

#define INF 0x3f3f3f3f

int n,m;
int maps[1005][1005];
int dis[1005];
bool vis[1005];

void Dijkstra(int s)
{
    memset(vis,false,sizeof(vis));

    for(int i=1;i<=n;i++)
        dis[i] = maps[s][i];

    dis[s] = INF;
    vis[s] = true;

    for(int i=1;i<n;i++)
    {
        int k = 0,tmp = 0;
        for(int j=1;j<=n;j++)
        {
            if(vis[j]) continue;
            if(dis[j]>tmp)
            {
                tmp = dis[j];
                k = j;
            }
        }

        vis[k] = true;
        for(int j=1;j<=n;j++)
        {
            if(vis[j]) continue;
            dis[j] = max(dis[j],min(dis[k],maps[k][j]));
        }
    }
}


int main()
{
    int cases;
    scanf("%d",&cases);
    for(int k=1;k<=cases;k++)
    {
        scanf("%d%d",&n,&m);
        memset(maps,0,sizeof(maps));
        for(int i=0;i<m;i++)
        {
            int u,v,c;
            scanf("%d%d%d",&u,&v,&c);
            maps[u][v] = maps[v][u] = max(maps[u][v],c);
        }
        Dijkstra(1);
        printf("Scenario #%d:
%d

",k,dis[n]);
    }
    return 0;
}
原文地址:https://www.cnblogs.com/TreeDream/p/5731451.html