最短路
最短路
时间限制: 3 Sec 内存限制: 128 MB提交: 76 解决: 34
[提交][状态][讨论版]
题目描述
给定M条边,N个点的带权无向图
求1到N的最短路
N<=100000
M<=500000
输入
第一行:N,M
接下来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
提示
注意图中可能有重边和自环,数据保证1到N有路径相连
题解:这道题和题目名字一样,看一下题目就知道是单源最短路,这题spfa比较好,其实dijstra+二叉堆也是可以的。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #include<cstdio> 2 #include<algorithm> 3 #include<iostream> 4 #include<cmath> 5 #include<cstring> 6 #include<string> 7 8 using namespace std; 9 const int MAXN=100007,MAXM=1000007; 10 11 int head[MAXN],next[MAXM],v[MAXM],pay[MAXM],dis[MAXN]; 12 int p[MAXN]; 13 bool boo[MAXN]; 14 int n,m,num; 15 16 void init() 17 { 18 num=0; 19 memset(head,-1,sizeof(head)); 20 memset(boo,0,sizeof(boo)); 21 for (int i=1;i<=n;i++) 22 dis[i]=MAXN*100; 23 dis[1]=0; 24 } 25 inline void add(int u,int arr,int z) 26 { 27 num++; 28 next[num]=head[u]; 29 head[u]=num; 30 v[num]=arr; 31 pay[num]=z; 32 } 33 void solve() 34 { 35 int top=0,tail=1; 36 p[tail]=1,boo[1]=1; 37 38 while (top!=tail) 39 { 40 top=top%n+1; 41 int u=p[top],arr; 42 for (int i=head[u];i!=-1;i=next[i]) 43 { 44 arr=v[i]; 45 if (dis[u]+pay[i]<dis[arr]) 46 { 47 dis[arr]=dis[u]+pay[i]; 48 if (boo[arr]==0) 49 { 50 tail=tail%n+1; 51 p[tail]=arr; 52 boo[arr]=1; 53 } 54 } 55 } 56 boo[u]=0; 57 } 58 59 } 60 int main() 61 { 62 scanf("%d%d",&n,&m); 63 64 init(); 65 66 int x,y,z; 67 for (int i=1;i<=m;i++) 68 { 69 scanf("%d%d%d",&x,&y,&z); 70 add(x,y,z); 71 add(y,x,z); 72 } 73 74 solve(); 75 76 printf("%d",dis[n]); 77 }