一:最短路
1:Floyd
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
void Floyd() { for(int k=1;k<=n;k++) { for(int i=1;i<=n;i++) { for(int j=1;j<=n;j++) { dis[i][j]=min(dis[i][j],dis[i][k]+dis[k][j]); } } } }
extend:Floyd求最小环
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
for(int i=1;i<=top;i++){ for(int j=1;j<=top;j++){ dis[i][j]=w[i][j]=INF; } } for(int i=1;i<=top;i++){ for(int j=i;j<=top;j++){ if(a[i]&a[j])dis[i][j]=dis[j][i]=w[i][j]=w[j][i]=1; if(i==j)dis[i][j]=w[i][j]=0; } } ll minn=INF; for(int k=1;k<=top;k++){ for(int i=1;i<k;i++){ for(int j=i+1;j<k;j++){ minn=min(minn,dis[i][j]+w[i][k]+w[k][j]); } } for(int i=1;i<=top;i++){ for(int j=1;j<=top;j++){ dis[i][j]=min(dis[i][j],dis[i][k]+dis[k][j]); } } } if(minn==INF)cout<<"-1"<<endl; else cout<<minn<<endl;
2:Dijkstra
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
void Dijkstra(int s) { memset(dis,INF,sizeof(dis)); memset(vis,0,sizeof(vis)); for(int i=1;i<=n;i++) dis[i]=a[s][i]; vis[s]=1; for(int i=1;i<=n-1;i++) { int minn=INF,u=-1; for(int j=1;j<=n;j++) { if(dis[j]<minn&&!vis[j]) { minn=dis[j]; u=j; } } if(u==-1) //优化 break; vis[u]=1; for(int v=1;v<=n;v++) { if(!vis[v]&&dis[v]>dis[u]+a[u][v]) { dis[v]=dis[u]+a[u][v]; } } } }
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
void Dijkstra(int s) { priority_queue<P,vector<P>,greater<P> >que; que.push(P(0,s)); dis[s]=0; while(!que.empty()) { P p=que.top(); que.pop(); int u=p.second; if(vis[u]) continue; vis[u]=1; for(int i=head[u]; i!=-1; i=e[i].next) { int v=e[i].v; int w=e[i].w; if(!vis[v]&&dis[v]>dis[u]+w) { dis[v]=dis[u]+w; que.push(P(dis[v],v)); } } } }
3:SPFA
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
void SPFA(int s) { dis[s]=0; queue<int>que; que.push(s); while(!que.empty()) { int u=que.front(); que.pop(); vis[u]=0; //出队 for(int i=head[u];i!=-1;i=e[i].next) { int v=e[i].v; int w=e[i].w; if(dis[v]>dis[u]+w) { dis[v]=dis[u]+w; if(vis[v]) continue; vis[v]=1; que.push(v); } } } }