最短路(信息学奥赛一本通-T1382)
生活随笔
收集整理的這篇文章主要介紹了
最短路(信息学奥赛一本通-T1382)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
【題目描述】
給定 M 條邊, N 個點的帶權無向圖。求 1 到 N 的最短路。
【輸入】
第一行:N,M(N≤100000,M≤500000)
接下來M行3個正整數:ai,bi,ci表示ai,bi之間有一條長度為ci的路,ci≤1000。
【輸出】
一個整數,表示 1 到 N 的最短距離。
【輸入樣例】
?4 4
1 2 1
2 3 1
3 4 1
2 4 1
【輸出樣例】
2
【源程序】
#include<iostream> #include<cstdio> #define INF 0x3f3f3f3f #define N 100100 using namespace std; struct node{int pre;int next;int w; }a[N*10]; int q[N*10],head[N]; int vis[N],f[N]; int cnt; void add(int x,int y,int w) {cnt++;a[cnt].pre=y;a[cnt].next=head[x];a[cnt].w=w;head[x]=cnt;cnt++;a[cnt].pre=x;a[cnt].next=head[y];a[cnt].w=w;head[y]=cnt; } int main() {int n,m;cin>>n>>m;for(int i=1;i<=m;i++){int x,y,w;cin>>x>>y>>w;add(x,y,w);}memset(f,INF,sizeof(f));f[1]=0;vis[1]=1;int headd=1,tail=1;q[tail]=1;tail++;while(headd<tail){int x=q[headd];int temp=head[x];while(temp!=0){int y=a[temp].pre;if(f[y]>f[x]+a[temp].w){f[y]=f[x]+a[temp].w;if(vis[y]==0){vis[y]=1;q[tail]=y;tail++;}}temp=a[temp].next;}vis[x]=0;headd++;}cout<<f[n]<<endl;return 0; }?
總結
以上是生活随笔為你收集整理的最短路(信息学奥赛一本通-T1382)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 鸣人的影分身(信息学奥赛一本通-T130
- 下一篇: 计算(信息学奥赛一本通-T1356)