① Floyd
多源最短路
#include <cstdio> #include <iostream> #include <algorithm> #include <cstring> #include <string> #include <stack> #include <queue> #include <cmath> #define ll long long #define pi 3.1415927 #define INF 0x3f3f3f3f using namespace std; int dis[1005][1005],n; void floyd (int n) { int i,j,k; for(k=0;k<n;++k) for(i=0;i<n;++i) for(j=0;j<n;++j) if(dis[i][j]>dis[i][k]+dis[k][j]) dis[i][j]=dis[i][k]+dis[k][j]; ///floyd的核心,挨个遍历,找出最短距离 } int main () { int n,m,i,t,j,k,x,y,p; scanf("%d",&n); memset(dis,INF,sizeof(dis)); //将距离初始化为最大值 while(cin>>x>>y>>p) dis[x][y]=p; for(i=0;i<n;++i) //自己到自己的距离为 0 dis[i][i]=0; floyd(n); for(i=0;i<n;++i){ for(t=0;t<n;++t) cout<<dis[i][t]<<" "; cout<<endl; } return 0; }
② dijkstra
单源最短路
#include <cstdio> #include <iostream> #include <algorithm> #include <cstring> #include <string> #include <stack> #include <queue> #include <cmath> #define ll long long #define pi 3.1415927 #define inf 0x3f3f3f3f using namespace std; int dis[1005],sign[1005],cost[1005][1005]; //dis[i] 点i到点0的距离 sign标记 cost[i][j] 点i到点j的距离 void init(int n) { //初始化 memset(dis,inf,sizeof(dis)); memset(sign,0,sizeof(sign)); memset(cost,inf,sizeof(cost)); //自己到自己的距离为零 for(int i=0;i<n;++i) cost[i][i]=0; } void dijkstra (int n,int s) { dis[0]=0; int i; while(1){ int f=-1; for(i=0;i<n;++i) //遍历每一个点,寻找到原点的最短距离 if(!sign[i] && (f==-1 || dis[i]<dis[f] )) f=i; if(f==-1) break; sign[f]=1; for(i=0;i<n;++i) //更新最短距离 dis[i]=min(dis[i],dis[f]+cost[f][i]); } } int main () { int n,m,i,t,j,k,x,y,p; cin>>n; init(n); while(cin>>x>>y>>p) cost[x][y]=p; dijkstra(n,0); for(i=0;i<n;++i) cout<<dis[i]<<" "; return 0; }
③ SPFA
单源最短路,可处理负边权