1.bellman-ford
1 #include2 #define INF 1000000 3 using namespace std; 4 struct edge 5 { 6 int from,to,cost; 7 edge(){} 8 edge(int ff,int tt,int cc) 9 {10 from=ff;11 to=tt;12 cost=cc;13 }14 };15 const int maxn=105;16 const int maxe=10005;17 int d[maxn];18 edge es[maxe];19 int v,e;20 21 void bellman_ford(int s)22 {23 fill(d,d+v,INF);24 d[s]=0;25 while(true)26 {27 bool update=false;28 for(int i=0;i d[e.from]+e.cost)32 {33 d[e.to]=d[e.from]+e.cost;34 update=true;35 }36 }37 if(!update) break;38 }39 for(int i=0;i d[e.from]+e.cost)54 {55 d[e.to]=d[e.from]+e.cost;56 57 //如果第n次仍然更新了,则存在负圈58 if(i==v-1) return true;59 }60 }61 }62 return false;63 }64 int main()65 {66 cin>>v>>e;67 int from,to,cost;68 for(int i=0;i >from>>to>>cost;71 from--;72 to--;73 es[i]=edge(from,to,cost);74 }75 //cout<
2.dijkstra
1 #include2 #define INF 1000000 3 using namespace std; 4 const int maxn=1010; 5 //邻接矩阵形式 6 int cost[maxn][maxn]; 7 int used[maxn]; 8 int d[maxn]; 9 int n;10 int prev[maxn];//最短路上所有前驱结点11 vector get_path(int t)12 {13 vector path;14 for(;t!=-1;t=prev[t])15 path.push_back(t);//不断沿着prev[t]走直到t=s16 reverse(path.begin(),path.end());17 return path;18 }19 void dijkstra(int s)20 {21 fill(d,d+n,INF);22 fill(used,used+n,0);23 fill(prev,prev+n,-1);24 d[s]=0;25 while(true)26 {27 int v=-1;28 for(int u=0; u d[v]+cost[v][u])40 {41 d[u]=d[v]+cost[v][u];42 prev[u]=v;43 }44 }45 }46 for(int i=0; i