1. 程式人生 > >FZU - 2261 浪裏個浪 SPFA最短路

FZU - 2261 浪裏個浪 SPFA最短路

全部 OS color esc mil point mem inpu bsp

題目

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


多源最短路 ,SPFA算法實現

把每一個可能的起點的所有可能終點全部跑了一遍 ,居然沒有TLE ,設初始minn為INF 然後每次查找後更新。
技術分享圖片
#include<iostream>
#include
<cstdio> #include<cstring> #include<queue> #include<algorithm> using namespace std; const int maxn = 1e5+10; const int inf = 0x3f3f3f3f; int n,m,len; int first[maxn],vis[maxn],dis[maxn],s[maxn],t[maxn]; struct point { int u,v,w,next; }edge[maxn]; void add_edge(int u,int v,int
w) { edge[len].v = v; edge[len].w = w; edge[len].next = first[u]; first[u] = len++; } void spfa(int start) { queue<int >q; for(int i=1;i<=n;i++){ dis[i] = inf; vis[i] = 0; } dis[start] = 0; vis[start] = 0; q.push(start); while(!q.empty()){ start = q.front(); q.pop(); vis[start] = 0; for(int i=first[start];i!=-1;i=edge[i].next){ int v = edge[i].v; int w = edge[i].w; if(dis[v]>dis[start]+w){ dis[v] = dis[start]+w; if(!vis[v]){ vis[v] =1; q.push(v); } } } } } int main() { int u,v,l; while(scanf("%d%d",&n,&m)!=EOF) { len = 1; memset(first,-1,sizeof(first)); for(int i=1;i<=m;i++){ scanf("%d%d%d",&u,&v,&l); add_edge(u,v,l); } int a,b; scanf("%d",&a); for(int i=1;i<=a;i++){ scanf("%d",&s[i]); } scanf("%d",&b); for(int i=1;i<=b;i++){ scanf("%d",&t[i]); } int minn = inf; for(int i=1;i<=a;i++){ spfa(s[i]); for(int j=1;j<=b;j++){ minn = min(minn , dis[t[j]]); } } printf("%d\n",minn); } return 0; }
View Code



FZU - 2261 浪裏個浪 SPFA最短路