最短路径·三:SPFA算法 HihoCoder - 1093 (spfa无向图)
生活随笔
收集整理的這篇文章主要介紹了
最短路径·三:SPFA算法 HihoCoder - 1093 (spfa无向图)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
描述
萬圣節的晚上,小Hi和小Ho在吃過晚飯之后,來到了一個巨大的鬼屋!
鬼屋中一共有N個地點,分別編號為1..N,這N個地點之間互相有一些道路連通,兩個地點之間可能有多條道路連通,但是并不存在一條兩端都是同一個地點的道路。
不過這個鬼屋雖然很大,但是其中的道路并不算多,所以小Hi還是希望能夠知道從入口到出口的最短距離是多少?
輸入
每個測試點(輸入文件)有且僅有一組測試數據。
在一組測試數據中:
第1行為4個整數N、M、S、T,分別表示鬼屋中地點的個數和道路的條數,入口(也是一個地點)的編號,出口(同樣也是一個地點)的編號。
接下來的M行,每行描述一條道路:其中的第i行為三個整數u_i, v_i, length_i,表明在編號為u_i的地點和編號為v_i的地點之間有一條長度為length_i的道路。
對于100%的數據,滿足N<=10^5,M<=10^6, 1 <= length_i <= 10^3, 1 <= S, T <= N, 且S不等于T。
對于100%的數據,滿足小Hi和小Ho總是有辦法從入口通過地圖上標注出來的道路到達出口。
輸出
對于每組測試數據,輸出一個整數Ans,表示那么小Hi和小Ho為了走出鬼屋至少要走的路程。
Sample Input
5 10 3 5
1 2 997
2 3 505
3 4 118
4 5 54
3 5 480
3 4 796
5 2 794
2 5 146
5 4 604
2 5 63
output
萬圣節的晚上,小Hi和小Ho在吃過晚飯之后,來到了一個巨大的鬼屋!
鬼屋中一共有N個地點,分別編號為1..N,這N個地點之間互相有一些道路連通,兩個地點之間可能有多條道路連通,但是并不存在一條兩端都是同一個地點的道路。
不過這個鬼屋雖然很大,但是其中的道路并不算多,所以小Hi還是希望能夠知道從入口到出口的最短距離是多少?
輸入
每個測試點(輸入文件)有且僅有一組測試數據。
在一組測試數據中:
第1行為4個整數N、M、S、T,分別表示鬼屋中地點的個數和道路的條數,入口(也是一個地點)的編號,出口(同樣也是一個地點)的編號。
接下來的M行,每行描述一條道路:其中的第i行為三個整數u_i, v_i, length_i,表明在編號為u_i的地點和編號為v_i的地點之間有一條長度為length_i的道路。
對于100%的數據,滿足N<=10^5,M<=10^6, 1 <= length_i <= 10^3, 1 <= S, T <= N, 且S不等于T。
對于100%的數據,滿足小Hi和小Ho總是有辦法從入口通過地圖上標注出來的道路到達出口。
輸出
對于每組測試數據,輸出一個整數Ans,表示那么小Hi和小Ho為了走出鬼屋至少要走的路程。
Sample Input
5 10 3 5
1 2 997
2 3 505
3 4 118
4 5 54
3 5 480
3 4 796
5 2 794
2 5 146
5 4 604
2 5 63
output
172
#include <cstring> #include <cstdio> #define maxn 1000010 #define INF 0x7fffffff using namespace std; struct node {int to,next,weight;}edge1[maxn]; int n,m; int idx1; int first1[maxn]; long long sum; int dist[maxn],vis[maxn],q[maxn*2]; void add(int u,int v,int w) {edge1[idx1].to=v;edge1[idx1].weight=w;edge1[idx1].next=first1[u];first1[u]=idx1;idx1++; }void spfa(int start,node *Edge,int *first) {int head=0,tail=1;memset(q,0,sizeof(q));for(int i=0;i<=n;++i){dist[i]=INF;vis[i]=0;}dist[start]=0;vis[start]=1;q[1]=start;while(head<tail){head++;int x=q[head];vis[x]=0;for(int i=first[x];i!=0;i=Edge[i].next){int y=Edge[i].to;if(dist[y]>dist[x]+Edge[i].weight){dist[y]=dist[x]+Edge[i].weight;if(!vis[y]){q[++tail]=y;vis[y]=1;}}}}} int main() {int c,u,v,w,start,end;while(cin>>n>>m>>start>>end){memset(first1,0,sizeof(first1));idx1=1;for(int i=0;i<m;++i){scanf("%d%d%d",&u,&v,&w);//cin>>u>>v>>w;add(u,v,w);add(v,u,w);//無向圖要搞兩次}sum=0;// int start,end;// cin>>start>>end;spfa(start,edge1,first1);//spfa(start,edge1,first1);cout<<dist[end]<<endl;}return 0; }總結
以上是生活随笔為你收集整理的最短路径·三:SPFA算法 HihoCoder - 1093 (spfa无向图)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: hdu1874 畅通工程续
- 下一篇: codeforces831c 思维