spfa/dijkstra模板(洛谷3371)
spfa:
1 //spfa:求s到各点的最短路,可含负权边 2 #include <cstdio> 3 4 using namespace std; 5 6 const int max_n=10010,max_m=500050,inf=2147483647; 7 8 struct etype 9 { 10 int t,w,next; 11 }; 12 13 etype e[max_m]; 14 int a[max_n],dis[max_n],q[max_n+5],cnt; 15 int inq[max_n]; 16 17 void add(int u,int v,int w) 18 { 19 cnt++;e[cnt].t=v;e[cnt].w=w; 20 e[cnt].next=a[u];a[u]=cnt; 21 } 22 23 int main() 24 { 25 int n,m,s; 26 scanf("%d%d%d",&n,&m,&s); 27 cnt=0; 28 for (int i=1;i<=m;i++) 29 { 30 int f,g,w; 31 scanf("%d%d%d",&f,&g,&w); 32 add(f,g,w); 33 } 34 for (int i=1;i<=n;i++) 35 { 36 inq[i]=false; 37 dis[i]=inf; 38 } 39 int h=0,t=1; 40 q[1]=s;dis[s]=0;inq[s]=true; 41 while (h!=t) 42 { 43 h++;if (h>max_n) h=1; 44 int i=a[q[h]]; 45 while (i>0) 46 { 47 if (dis[q[h]]+e[i].w<dis[e[i].t]) 48 { 49 dis[e[i].t]=dis[q[h]]+e[i].w; 50 if (!inq[e[i].t]) 51 { 52 t++;if (t>max_n) t=1; 53 q[t]=e[i].t;inq[e[i].t]=true; 54 } 55 } 56 i=e[i].next; 57 } 58 inq[q[h]]=false;; 59 } 60 printf("%d",dis[1]); 61 for (int i=2;i<=n;i++) printf(" %d",dis[i]); 62 return 0; 63 }
dijkstra:
1 #include <cstdio> 2 #include <vector> 3 4 using namespace std; 5 6 int d[10010]; 7 bool v[10010]; 8 vector<int> a[10010],w[10010]; 9 10 int main() 11 { 12 int n,m,s; 13 scanf("%d%d%d",&n,&m,&s); 14 for (int i=1;i<=m;i++) 15 { 16 int x,y,z; 17 scanf("%d%d%d",&x,&y,&z); 18 a[x].push_back(y); 19 w[x].push_back(z); 20 } 21 for (int i=0;i<=n;i++) 22 { 23 d[i]=2147483647; 24 v[i]=false; 25 } 26 d[s]=0; 27 for (int i=1;i<n;i++) 28 { 29 int k=0; 30 for (int j=1;j<=n;j++) 31 if (!v[j] && d[j]<d[k]) 32 k=j; 33 v[k]=true; 34 for (int j=0;j<a[k].size();j++) 35 if (d[k]+w[k][j]<d[a[k][j]]) 36 d[a[k][j]]=d[k]+w[k][j]; 37 } 38 for (int i=1;i<=n;i++) 39 printf("%d ",d[i]); 40 return 0; 41 }