POJ-1797-Heavy Transportation

链接:https://vjudge.net/problem/POJ-1797

题意:

给n结点,m条路。路径形式以,L R V给出。

V为路径承受的最大重量。

求从1到N路径能承受的最大重量。

思路:

依然Dijkstra算法。刚开始想错了,debug半天,发现不需要把地图数组初始化较大值。

Dis数组维护 :Dis[j] = max(Dis[j],min(Max,Map[w][j]));

Max为当前最大重量,w为其坐标。

代码:

#include <iostream>
#include <stack>
#include <memory.h>
#include <string>
#include <algorithm>
#include <math.h>
#include <iomanip>
using namespace std;
const int MAXN = 1000+10;
const int INF = 1e9;
int Map[MAXN][MAXN];
int Dis[MAXN];
int Vis[MAXN];
int n,m;

void Print_Dis()
{
    for (int i = 1;i<=n;i++)
        cout << Dis[i] << ' ';
    cout << endl;
}

int Dijkstra()
{
    memset(Dis,0, sizeof(Dis));
    memset(Vis,0, sizeof(Vis));
    for (int i = 1;i<=n;i++)
        Dis[i] = Map[1][i];
    Vis[1] = 1;
    for (int i = 1;i<=n;i++)
    {
        int w = -1,Max = 0;
        for (int j = 1;j<=n;j++)
        {
            if (Vis[j] == 0&&Max < Dis[j])
            {
                w = j;
                Max = Dis[j];//找到Dis数组中的最大值
            }
        }
        Vis[w] = 1;
        if (w == n)//找的的为n直接返回
            return Dis[w];
        for (int j = 1;j<=n;j++)
        {
            if (Vis[j] == 0)
            {
                Dis[j] = max(Dis[j],min(Max,Map[w][j]));//Dis数组维护
                //cout << Max << ' ' << Map[w][j] << endl;
            }
        }
        //cout << w << endl;
        //cout << Max << ' ' << Map[w][4] << endl;
        //Print_Dis();
    }
}

int main()
{
    int t,cnt = 0;
    int x,y,l;
    scanf("%d",&t);
    while (t--)
    {
        scanf("%d%d",&n,&m);
        memset(Map,0, sizeof(Map));
        for (int i = 1;i<=m;i++)
        {
            scanf("%d%d%d",&x,&y,&l);
            Map[x][y] = Map[y][x] = l;
        }
        int Max = Dijkstra();
        if (cnt != 0)
            printf("\n");
        printf("Scenario #%d:\n%d\n",++cnt,Max);
    }

    return 0;
}

  

猜你喜欢

转载自www.cnblogs.com/YDDDD/p/10272788.html