最短路

最短路

时间限制: 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+二叉堆也是可以的。

 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 } 
View Code

 

转载于:https://www.cnblogs.com/fengzhiyuan/p/6953466.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值