链接: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;
}