POJ 1797 Heavy Transportation【改寫最短路】

POJ 1797 Heavy Transportation

題目大意:
存在圖中1到n號點的路徑,求多條路徑中最小權值最大的一條,輸出最大的最小權值

具體思路:
改寫最短路解法或者最大生成樹(把權值變爲負數,直接用最小生成樹算法,結果取絕對值)
詳細思路可見這篇博客POJ2253,它是求最小的最大權值。

下方代碼爲改寫最短路

具體代碼:

#include<iostream>
#include<cstdio>
#include<cmath>
#include<stdlib.h>
#include<algorithm>
using namespace std;
const int N = 1005;
const int INF = 1e5;
int maps[N][N];
int visit[N];
int d[N];	//終點爲i的最大最小權值
int cross, street;
void init()
{
	for (int i = 1; i <= cross; i++)
	{
		visit[i] = 0;
	}
	for (int i = 1; i <= cross; i++)
		for (int j = 1; j <= cross; j++)
			maps[i][j] = -1;	//這裏要改寫
}
void dijkstra()
{
	for (int i = 1; i <= cross; i++)
	{
		d[i] = maps[1][i];
	}
	d[1] = 0;
	visit[1] = 1;
	for (int i = 1; i <= cross; i++)
	{
		int t = -1;
		for (int j = 2; j <= cross; j++)
		{
			if (!visit[j] && (t == -1 || d[t] < d[j]))	//這裏要改寫
				t = j;
		}
		if (t == -1)return;
		visit[t] = 1;
		for (int j = 2; j <= cross; j++)
		{
			if (!visit[j] && d[j] < min(d[t], maps[t][j]))	//這裏要改寫
				d[j] = min(d[t], maps[t][j]);
		}
	}
}

int main()
{
	int n;
	int cnt = 1;
	cin >> n;
	for (int i = 1; i <= n; i++)
	{
		int x, y, w;
		cin >> cross >> street;
		init();
		for (int j = 1; j <= street; j++)
		{
			cin >> x >> y >> w;
			if (w > maps[x][y])	//考慮重邊,這裏要改寫
				maps[x][y] = maps[y][x] = w;
		}
		dijkstra();
		printf("Scenario #%d:\n", cnt);
		printf("%d\n\n", d[cross]);
		cnt++;
	}
	return 0;
}

發佈了69 篇原創文章 · 獲贊 34 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章