1. 程式人生 > >奶牛跨欄

奶牛跨欄

標題: 奶牛跨欄
標籤: 圖結構 最短路
詳情: Farmer John 想讓她的奶牛準備郡級跳躍比賽,貝茜和她的夥伴們正在練習跨欄。她們很累,所以她們想消耗最少的能量來跨欄。 顯然,對於一頭奶牛跳過幾個矮欄是很容易的,但是高欄卻很難。於是,奶牛們總是關心路徑上最高的欄的高度。 奶牛的訓練場中有 N (1 ≤ N ≤ 300) 個站臺,分別標記為1..N。所有站臺之間有M (1 ≤ M ≤ 25,000)條單向路徑,第i條路經是從站臺Si開始,到站臺Ei,其中最高的欄的高度為Hi (1 ≤ Hi ≤ 1,000,000)。無論如何跑,奶牛們都要跨欄。 奶牛們有 T (1 ≤ T ≤ 40,000) 個訓練任務要完成。第 i 個任務包含兩個數字 Ai 和 Bi (1 ≤ Ai ≤ N; 1 ≤ Bi ≤ N),表示奶牛必須從站臺Ai跑到站臺Bi,可以路過別的站臺。奶牛們想找一條路徑從站臺Ai到站臺Bi,使路徑上最高的欄的高度最小。 你的任務就是寫一個程式,計算出路徑上最高的欄的高度的最小值。
輸入格式:
第一行1:兩個整數 N, M, T 行
接下來M行:每行包含三個整數 Si , Ei , Hi
接下來T 行:每行包含兩個整數,表示任務i的起始站臺和目標站臺: Ai , Bi
輸出格式:
行 1..T: 行 i 為一個整數,表示任務i路徑上最高的欄的高度的最小值。如果無法到達,輸出 -1。
樣例:

輸入

5 6 3
1 2 12
3 2 8
1 3 5
2 5 3
3 4 4
2 4 8
3 4
1 2
5 1

輸出

4
8
-1

 

#include <iostream>
using namespace std;

int a[301][301];
int inf=1000001;
int main(int argc, char *argv[]) {
	int n,m,t;
	cin>>n>>m>>t;
	int p,q; 
	for(int i=1;i<=n;i++)
		for(int j=1;j<=n;j++)
			a[i][j]=inf;
	for(int i=1;i<=m;i++){
			cin>>p>>q;
			cin>>a[p][q];		
		}	 
	for(int k=1;k<=n;k++)
		for(int i=1;i<=n;i++)
			for(int j=1;j<=n;j++)
				//k為i,j經過的中間節點。
				//x,y座標相等的點為自身初始化的值。 
				if(i!=j && j!=k && i!=k){
					a[i][j]=min(a[i][j],max(a[i][k],a[k][j])); 
	while(t--){
		cin>>n>>m;
		if(a[n][m]==inf)
			cout<<"-1"<<endl; 
		else
			cout<<a[n][m]<<endl;		
	}

	return 0;
}