A

题目链接:https://vjudge.net/contest/215608#problem/A

Dijkstra算法

 1 #include <iostream>
 2 #include <cstdio>
 3 const int inf=0x3f3f3f3f;
 4 const int maxn=1<<10;
 5 int mp[maxn][maxn];
 6 int n,m;
 7 
 8 void Dijkstra()
 9 {
10     int minn=inf,v;
11     int d[maxn];
12     bool vis[maxn];
13 
14     for(int i=1;i<=n;i++)
15     {
16         vis[i]=0;
17         d[i]=mp[1][i];
18     }
19     for(int i=1;i<=n;i++)
20     {
21         minn=inf;
22         for(int j=1;j<=n;j++)
23         {
24             if(!vis[j]&&minn>d[j])
25             {
26                 v=j;
27                 minn=d[j];
28             }
29 
30         }
31         vis[v]=1;
32         for(int j=1;j<=n;j++)
33         {
34             if(!vis[j]&&d[j]>mp[v][j]+d[v])
35             {
36                 d[j]=mp[v][j]+d[v];
37             }
38         }
39     }
40     printf("%d
",d[n]);
41 }
42 
43 
44 int main()
45 {
46     int a,b,c;
47     scanf("%d%d",&m,&n);
48     for(int i=1;i<=n;i++)
49     {
50         for(int j=1;j<=n;j++)
51         {
52             if(i==j) mp[i][j]=0;
53             else mp[i][j]=mp[j][i]=inf;
54         }
55     }
56     for(int i=1;i<=m;i++)
57     {
58         scanf("%d%d%d",&a,&b,&c);
59         if(mp[a][b]>c) mp[a][b]=mp[b][a]=c;
60     }
61     Dijkstra();
62     return 0;
63 }
Dijkstra

SPFA算法

 1 #include<cstdio>
 2 #include<iostream>
 3 #include<algorithm>
 4 #include<cstring>
 5 #include<queue>
 6 
 7 using namespace std;
 8 const int maxn=4010;
 9 const int INF=0x3f3f3f3f;
10 
11 struct node
12 {
13     int v;
14     int w;
15     int next;
16 }G[maxn];
17 int first[maxn];
18 int dis[maxn];
19 bool vis[maxn];
20 int N,M;
21 int len;
22 
23 void SPFA(int star)
24 {
25     memset(dis,0x3f,sizeof(dis));
26     dis[star]=0;
27     memset(vis,false,sizeof(vis));
28     vis[star]=true;
29     queue<int>q;
30     q.push(star);
31     while(!q.empty())
32     {
33         star=q.front();
34         q.pop();
35         vis[star]=false;
36         for(int i=first[star];i!=-1;i=G[i].next)//遍历顶点的邻接表
37         {
38             if(dis[G[i].v]>dis[star]+G[i].w)
39             {
40                 dis[G[i].v]=dis[star]+G[i].w;//松弛
41                 if(vis[G[i].v]==false)
42                 {
43                     vis[G[i].v]=true;
44                     q.push(G[i].v);
45                 }
46             }
47         }
48     }
49 }
50 void add_edge(int u,int v,int w)
51 {
52     G[len].v=v;
53     G[len].w=w;
54     G[len].next=first[u];
55     first[u]=len++;
56 }
57 int main()
58 {
59     scanf("%d%d",&M,&N);
60     memset(first,-1,sizeof(first));
61     len=0;
62     for(int i=1;i<=M;i++)
63     {
64         int u,v,w;
65         scanf("%d%d%d",&u,&v,&w);
66         add_edge(u,v,w);
67         add_edge(v,u,w);
68     }
69     SPFA(1);
70     printf("%d
",dis[N]);
71     return 0;
72 }
SPFA
原文地址:https://www.cnblogs.com/Fy1999/p/8707278.html