先附上Djikstra的代码:普通版
const int maxn=101; const int INF=0x3f3f3f3f; int edges[maxn][maxn]; int dist[maxn]; void dijkstra(int s,int n){ bool done[maxn]; memset(done,0,sizeof(done)); done[s]=true; for(int i=0;i<n;i++) dist[i]=edges[s][i]; for(int i=0,min,u;i<n;i++){ min=INF; for(int j=0;j<n;j++) if(!done[j] && dist[j]<min){ min=dist[j]; u=j; } done[u]=true; for(int j=0;j<n;j++){ if(dist[u]+edges[u][j]<dist[j]) dist[j]=dist[u]+edges[u][j]; } } }
2.Bellman-Ford 算法
优点:能处理包含负权边的图
//单源点最短路径 - Bellman-Ford算法 #define maxn 31 #define inf 0x3f3f3f3f class edge{ public: int from,to,cost; edge(){ from=0,to=0,cost=0; } edge(int a,int b ,int c){ from=a,to=b,cost=c; } }; edge Edges[maxn]; int dist[maxn]; void init(){ for(int i=1;i<maxn;i++){ for(int j=1;j<maxn;j++){ if(i==j) Edges[i]=edge(i,j,1); else Edges[i]=edge(i,j,inf); } } } /*V:顶点数,E:边数*/ void bellman_ford(int s,int V,int E){ for(int i=0;i<V;i++) dist[i]=inf; dist[s]=0; for(int i=1;i<=V;i++){ bool update=false; for(int j=0;j<E;j++){ edge e=Edges[j]; if(dist[e.from]!=inf && dist[e.to]>dist[e.from]+e.cost){ dist[e.to]=dist[e.from]+e.cost; update=true; } } if(!update)break; } }
3.Floyd_Warshall算法
#define maxn 31 #define inf 0x3f3f3f3f double edges[maxn][maxn]; void init(){ for(int i=1;i<maxn;i++) for(int j=1;j<maxn;j++) edges[i][j]=(i==j?1:inf); } void floyd_warshall(int n){ for(int k=1;k<=n;k++){ for(int i=1,u;i<=n;i++){ for(int j=1;j<=n;j++){ if(edges[i][k]+edges[k][j]<edges[i][j]) edges[i][j]=edges[i][k]+edges[k][j]; } } } }