奶牛跨欄
阿新 • • 發佈:2018-12-26
標題: | 奶牛跨欄 | ||
標籤: | 圖結構 最短路 | ||
詳情: | 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。 |
||
樣例: |
|
#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; }