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; }