A - Til the Cows Come Home
题目链接: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\n",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 }
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\n",dis[N]); 71 return 0; 72 }