1. 程式人生 > >哈爾濱理工大學第七屆程式設計競賽初賽(高年級組)I 旅行【列舉+spfa】

哈爾濱理工大學第七屆程式設計競賽初賽(高年級組)I 旅行【列舉+spfa】

時間限制:C/C++ 2秒,其他語言4秒
空間限制:C/C++ 32768K,其他語言65536K
64bit IO Format: %lld
題目描述

小z放假了,準備到RRR城市旅行,其中這個城市有N個旅遊景點。小z時間有限,只能在三個旅行景點進行遊玩。小明租了輛車,司機很善良,說咱不計路程,只要你一次性繳費足夠,我就帶你走遍RRR城。

小z很開心,直接就把錢一次性繳足了。然而小z心機很重,他想選擇的路程儘量長。

然而司機也很聰明,他每次從一個點走到另外一個點的時候都走最短路徑。

你能幫幫小z嗎?

需要保證這三個旅行景點一個作為起點,一個作為中轉點一個作為終點。(一共三個景點,並且需要保證這三個景點不能重複).
輸入描述:
本題包含多組輸入,第一行輸入一個整數t,表示測試資料的組數
每組測試資料第一行輸入兩個數N,M表示RRR城一共有的旅遊景點的數量,以及RRR城中有的路的數量。
接下來M行,每行三個數,a,b,c表示從a景點和b景點之間有一條長為c的路
t<=40
3<=N,M<=1000
1<=a,b<=N
1<=c<=100
輸出描述:
每組資料輸出兩行,
每組資料包含一行,輸出一個數,表示整條路程的路長。
如果找不到可行解,輸出-1.
示例1
輸入
4
7 7
1 2 100
2 3 100
1 4 4
4 5 6
5 6 10
1 6 4
6 7 8
7 3
1 2 1
1 3 1
1 3 2
7 3
1 2 1
3 4 1
5 6 1
8 9
1 2 1
2 3 1
3 4 1
4 1 1
4 5 1
5 6 1
6 7 1
7 8 1
8 5 1
輸出
422
3
-1
9

分析:列舉所有的中轉點,得到其兩個最大的dis[j],時間複雜度O(n*nlogn)

#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
#include<algorithm>
#define INF 500000
using namespace std;
const int maxn = 2e3 + 10;
int dis[maxn];
int to[maxn];
int h[maxn];
int f[maxn];
int nx[maxn];
int
val[maxn]; int sz; int n,m,T; void add(int x, int y, int c) { to[sz] = y; val[sz] = c; nx[sz] = h[x]; h[x] = sz++; } void spfa(int x) { for (int i = 1; i <= n; i++) { dis[i] = 500000; f[i] = 0; } queue<int> q; q.push(x); f[x] = 1; dis[x] = 0
; while (!q.empty()) { int id = q.front(); q.pop(); f[id] = 0; for (int i = h[id]; i != -1; i = nx[i]) { if (dis[id] + val[i] < dis[to[i]]) { dis[to[i]] = dis[id] + val[i]; if (f[to[i]] == 0) { f[to[i]] = 1; q.push(to[i]); } } } } } int main() { scanf("%d", &T); while (T--) { scanf("%d%d", &n, &m); memset(h, -1, sizeof h); sz = 0; while (m--) { int a, b, c; scanf("%d%d%d", &a, &b, &c); add(a, b, c); add(b, a, c); } int ans = -1; int sum1, sum2; for (int i = 1; i <= n; i++) { spfa(i); sort(dis + 1, dis + n + 1); sum1 = sum2 = 0; for (int j = n; j >= 1; j--) { if (dis[j] == 0) continue; if (dis[j] == 500000) continue; if (sum1 < 2) { sum1++; sum2 = sum2 + dis[j]; } } if (sum1 == 2) { ans = max(sum2, ans); } } printf("%d\n", ans); } return 0; }