problem description
input
輸入資料有多組,每組的第一行是三個整數t,s和d,表示有t條路,和草兒家相鄰的城市的有s個,草兒想去的地方有d個;
接著有t行,每行有三個整數a,b,time,表示a,b城市之間的車程是time小時;(1=<(a,b)<=1000;a,b 之間可能有多條路)
接著的第t+1行有s個數,表示和草兒家相連的城市;
接著的第t+2行有d個數,表示草兒想去地方。
output
輸出草兒能去某個喜歡的城市的最短時間。
sample input
6 2 3
1 3 5
1 4 7
2 8 12
3 8 4
4 9 12
9 10 2
1 28 9 10
sample output
9
題目分析:
這是乙個求最短路徑的問題,是多源多結點型,在用dijkstra時採用雙重for迴圈,結果tle。後考慮到每乙個源結點的dijkstra()可以搜尋所有的目的結點,遂將第二重for迴圈放到dijkstra()中,結果ac。
此題有乙個地方需注意,(1=<(a,b)<=1000;a,b 之間可能有多條路),此句要注意a,b之間取最小路,去重問題。
**:
// hdu 2066 乙個人的旅行
// 迪傑斯特拉--最短路徑問題
// 從源頂點到達各個頂點,的 最短距離
#include#include#include#include//memset
#include// max
#define int_max 0x7fffffff
#define alone -1;
using namespace std;
/*function: dijkstra(int v,int n,vector&dist,vector&pre,vector> &d)
param: int v:開始節點
int n: 節點數
dist : 距離
pre : 父輩節點
d : 圖
return: void
注意:1.下標從0還是從1開始? 決定了n/ s(n)/s(n+1)
2.孤立節點怎麼處理
*/int dijkstra(int v,int n,int* dist,int* pre,vector> d,int d,int *b )
else pre[i]=alone; //未找到父輩
} dist[v]=0; //開始節點的距離 置0
s[v]=true; //開始節點 染黑
for(int i=2;i<=n;i++) // n-1 次迴圈}}
} for(int i=0;idist[b[i]]) result=dist[b[i]];
} return result;
}int main()
} int p,q,value; // p->q
int max_point=0;
for(int i=0;i>p>>q>>value;
if(max_point <= max(p,q))
max_point=max(p,q);
if(value< d[p][q] )
}int n=max_point;
int a[n],b[n];
for(int i=0;i>a[i];
} for(int i=0;i>b[i]; }
int min_dist=int_max;
for(int i=0;i
HDU 2066 最短路徑問題
誰知道這個題目我弄了好久,有點不按套路出牌 真的是乙個人的旅行aaaa problem description 輸入資料有多組,每組的第一行是三個整數t,s和d,表示有t條路,和草兒家相鄰的城市的有s個,草兒想去的地方有d個 接著有t行,每行有三個整數a,b,time,表示a,b城市之間的車程是ti...
HDU 2066 一 個人的旅行 最短路)
乙個人的旅行 time limit 1000msmemory limit 32768kb64bit io format i64d i64u submit status practice hdu 2066 description input 輸入資料有多組,每組的第一行是三個整數t,s和d,表示有t條...
最短路 HDU2066 乙個人的旅行
description input 輸入資料有多組,每組的第一行是三個整數t,s和d,表示有t條路,和草兒家相鄰的城市的有s個,草兒想去的地方有d個 接著有t行,每行有三個整數a,b,time,表示a,b城市之間的車程是time小時 1 接著的第t 1行有s個數,表示和草兒家相連的城市 接著的第t ...