最短路模板(dijkstra+鄰接表)
阿新 • • 發佈:2018-12-24
其他的模板會陸續上傳~#include<iostream> #include<algorithm> #include<stdio.h> #include<stdlib.h> #include<string.h> #include<queue> #include<math.h> #include<set> #include<vector> using namespace std; #define maxn 550 #define MM 10000000 int V[maxn]; int d[maxn]; int fa[maxn]; int first[maxn],next[maxn],w[maxn],u[maxn],v[maxn]; int n,m; void read_() { //單向 or 雙向均可~ scanf("%d%d",&n,&m); memset(first,-1,sizeof(first)); for(int i=1;i<=m;i++) { scanf("%d%d%d",&u[i],&v[i],&w[i]); next[i]=first[u[i]]; first[u[i]]=i; } //雙向路徑 for(int i=m+1;i<=2*m;i++) { u[i]=v[i-m]; v[i]=u[i-m]; w[i]=w[i-m]; next[i]=first[u[i]]; first[u[i]]=i; } } void Dijjkstra() { memset(V,0,sizeof(V)); memset(fa,0,sizeof(fa)); for(int i=1;i<=n;i++) d[i]=(i==1?0:MM); for(int i=1;i<=n;i++) { int x,mm=MM; for(int j=1;j<=n;j++) if(d[j]<mm && !V[j]) mm=d[x=j]; V[x]=1; for(int e=first[x];e!=-1;e=next[e]) { if(d[v[e]]>d[x]+w[e]) { d[v[e]]=d[x]+w[e]; fa[v[e]]=x; } } } } void dfs(int x ) //輸出路徑 { cout<<x<<endl; if(fa[x]==0) return; else { dfs(fa[x]); if(x==n) cout<<fa[x]; else cout<<fa[x]<<' '; } } int main() { read_(); Dijjkstra(); dfs(n); //輸出路徑:可更改終點值。 cout<<' '<<n<<endl; return 0; }