最短路HDU1874通工程续
中文题。裸裸的最短路,练习各种模板。
题目:http://acm.hdu.edu.cn/showproblem.php?pid=1874
Floyd
#include <cstdio> #include <cstdlib> #include <cstring> #include <algorithm> #include <cmath> #include <stack> #include <queue> #include <vector> #include <map> #include <string> #include <iostream> using namespace std; const int INF=0xfffffff; int n; int dp[1111][11111]; void fly() { for(int k=0;k<n;k++) for(int i=0;i<n;i++){ for(int j=0;j<n;j++){ if(dp[i][j]>dp[i][k]+dp[k][j]) dp[i][j]=dp[i][k]+dp[k][j]; } } } int main() { int m; while(scanf("%d%d",&n,&m)!=EOF){ for(int i=0;i<n;i++) for(int j=0;j<n;j++){ if(i==j) dp[i][j]=0; else dp[i][j]=INF; } for(int i=0;i<m;i++){ int a,b,c; scanf("%d%d%d",&a,&b,&c); if(dp[a][b]>c) dp[a][b]=dp[b][a]=c; } fly(); int s;int e; scanf("%d%d",&s,&e); if(dp[s][e]==INF) printf("-1\n"); else printf("%d\n",dp[s][e]); } return 0; }
Djs+优先队列+邻接表
#include <cstdio> #include <cstdlib> #include <cstring> #include <algorithm> #include <cmath> #include <stack> #include <queue> #include <vector> #include <map> #include <string> #include <iostream> using namespace std; const int INF=0xfffffff; struct edge { int val;int next;int to; }e[1111111]; int len;int head[111111]; void add(int from ,int to,int val) { e[len].to=to; e[len].val=val; e[len].next=head[from]; head[from]=len++; } struct Node { int x;int dist; }; struct cmp { bool operator() (const Node &a,const Node & b) { return a.dist>b.dist; } }; int n; int dis[1000]; int vis[1000]; void djs(int x) { for(int i=0;i<n;i++) dis[i]=INF; memset(vis,0,sizeof(vis)); dis[x]=0; Node k;k.x=x;k.dist=0; priority_queue<Node,vector<Node>,cmp> q; q.push(k); while(!q.empty()){ int cur=q.top().x; q.pop(); if(vis[cur]) continue; vis[cur]=1; for(int i=head[cur];i!=-1;i=e[i].next){ int cc=e[i].to; if(!vis[cc]&&dis[cur]+e[i].val<dis[cc]){ dis[cc]=dis[cur]+e[i].val; Node k;k.x=cc;k.dist=dis[cc]; q.push(k); } } } } int main() { int m,a,b,c,e,s; while(scanf("%d%d",&n,&m)!=EOF){ len=0;memset(head,-1,sizeof(head)); for(int i=0;i<m;i++){ scanf("%d%d%d",&a,&b,&c); add(a,b,c); add(b,a,c); } scanf("%d%d",&s,&e); djs(s); if(dis[e]==INF){ printf("-1\n"); } else printf("%d\n",dis[e]); } return 0; }
spfa+邻接表
#include <cstdio> #include <cstdlib> #include <cstring> #include <algorithm> #include <cmath> #include <stack> #include <queue> #include <vector> #include <map> #include <string> #include <iostream> using namespace std; const int INF=0xffffff; struct edge { int val;int next;int to; }e[111111]; int len;int head[10000]; void add(int from,int to,int val) { e[len].to=to; e[len].val=val; e[len].next=head[from]; head[from]=len++; } int dis[111111]; int vis[111111]; int n; void spfa(int x) { for(int i=0;i<n;i++) dis[i]=INF; memset(vis,0,sizeof(vis)); dis[x]=0;vis[x]=1; queue<int> q; q.push(x); while(!q.empty()){ int cur=q.front(); q.pop(); vis[cur]=0; for(int i=head[cur];i!=-1;i=e[i].next){ int cc=e[i].to; if(dis[cc]>dis[cur]+e[i].val){ dis[cc]=dis[cur]+e[i].val; if(!vis[cc]){ vis[cc]=1; q.push(cc); } } } } } int main() { int m,a,b,c,s,e; while(scanf("%d%d",&n,&m)!=EOF){ len=0;memset(head,-1,sizeof(head)); for(int i=0;i<m;i++){ scanf("%d%d%d",&a,&b,&c); add(a,b,c); add(b,a,c); } scanf("%d%d",&s,&e); spfa(s); if(dis[e]==INF) printf("-1\n"); else printf("%d\n",dis[e]); } return 0; }