浪裏個浪 FZU - 2261
阿新 • • 發佈:2018-09-11
fir pen nod 網上 測試數據 單行 時間 技術分享 姐姐
TonyY是一個喜歡到處浪的男人,他的夢想是帶著蘭蘭姐姐浪遍天朝的各個角落,不過在此之前,他需要做好規劃。
現在他的手上有一份天朝地圖,上面有n個城市,m條交通路徑,每條交通路徑都是單行道。他已經預先規劃好了一些點作為旅遊的起點和終點,他想選擇其中一個起點和一個終點,並找出從起點到終點的一條路線親身體驗浪的過程。但是他時間有限,所以想選擇耗時最小的,你能告訴他最小的耗時是多少嗎?
Input
包含多組測試數據。
輸入第一行包括兩個整數n和m,表示有n個地點,m條可行路徑。點的編號為1 - n。
接下來m行每行包括三個整數i, j, cost,表示從地點i到地點j需要耗時cost。
接下來一行第一個數為S,表示可能的起點數,之後S個數,表示可能的起點。
接下來一行第一個數為E,表示可能的終點數,之後E個數,表示可能的終點。
0<S, E≤n≤100000,0<m≤100000,0<cost≤100。
Output
輸出他需要的最短耗時。
Sample Input
4 4 1 3 1 1 4 2 2 3 3 2 4 4 2 1 2 2 3 4
Sample Output
1
em 這個題開始就想到了炒雞源點和炒雞匯點,結果偷懶不寫隊列優化T了,看到網上很多用spfa的,還有用網絡流的大佬,網絡流我還不會,這裏附上隊列優化迪傑斯特拉的解法
1 #include<iostream> 2 #include<cstdio> 3View Code#include<vector> 4 #include<string.h> 5 #include<queue> 6 #include<utility> 7 #define INF 0x3f3f3f3f 8 9 using namespace std; 10 typedef pair<int,int> P; 11 12 struct node 13 { 14 int to,w; 15 node(int v,int val):to(v),w(val) {} 16 }; 17 18 int n,m; 19 constint maxn = 100007; 20 int vis[maxn]; 21 int dist[maxn]; 22 vector<node>g[maxn]; 23 24 void init() 25 { 26 27 int a,b,c; 28 for(int i=0; i<=n; i++)g[i].clear(); 29 for(int i=0; i<m; i++) 30 { 31 scanf("%d%d%d",&a,&b,&c); 32 g[a].push_back(node(b,c)); 33 } 34 scanf("%d",&a); 35 for(int i=0; i<a; i++) 36 { 37 scanf("%d",&b); 38 g[0].push_back(node(b,0)); 39 } 40 scanf("%d",&a); 41 for(int i=0; i<a; i++) 42 { 43 scanf("%d",&b); 44 g[b].push_back(node(n+1,0)); 45 } 46 } 47 48 void dijkstra(int start) 49 { 50 priority_queue<P,vector<P>,greater<P> >que; 51 memset(dist,INF,sizeof(dist)); 52 dist[start] = 0; 53 que.push(P(0,start)); 54 while(!que.empty()) 55 { 56 P p = que.top(); 57 que.pop(); 58 int v = p.second; 59 if(dist[v]<p.first)continue; 60 for(int i=0; i<g[v].size(); i++) 61 { 62 node e = g[v][i]; 63 if(dist[e.to] > dist[v] + e.w) 64 { 65 dist[e.to] = dist[v] + e.w; 66 que.push(P(dist[e.to],e.to)); 67 } 68 } 69 } 70 } 71 72 int main() 73 { 74 while(~scanf("%d%d",&n,&m)) 75 { 76 init(); 77 dijkstra(0); 78 printf("%d\n",dist[n+1]); 79 } 80 return 0; 81 }
浪裏個浪 FZU - 2261