1.Floyd(求出整张图任意两点的最短路径)
1 #define rep(i,a,b) for(int i=a;i<=b;i++) 2 3 rep(k,1,n) 4 rep(i,1,n) 5 rep(j,1,n)dis[i][j]=min(dis[i][j],dis[i][k]+dis[k][j]);
2.dijkstra+优先队列优化(单源最短路径)
【有负权边则不可用】
1 #include<iostream> 2 #include<iomanip> 3 #include<ctime> 4 #include<climits> 5 #include<algorithm> 6 #include<queue> 7 #include<vector> 8 #include<cstring> 9 #include<cstdio> 10 #include<cstdlib> 11 #include<map> 12 using namespace std; 13 typedef long long LL; 14 #define rep(i,a,b) for(int i=a;i<=b;i++) 15 #define dep(i,a,b) for(int i=a;i>=b;i--) 16 const int M=10001; 17 int n,m,s,dis[M]; 18 typedef pair<int,int>P;//图和优先队列中的first均为节点,second均为距离 19 vector<P>G[M];//动态数组描述有向图 20 priority_queue<P>q; 21 int main(){ 22 scanf("%d%d%d",&n,&m,&s); 23 rep(i,1,n)dis[i]=INT_MAX; 24 rep(i,1,m){ 25 int u,v,l; 26 scanf("%d%d%d",&u,&v,&l); 27 G[u].push_back(P(l,v)); 28 } 29 dis[s]=0; 30 q.push(P(0,s)); 31 while(!q.empty()){ 32 P p=q.top();q.pop(); 33 int v=p.second; 34 if(dis[v]<-p.first)continue;//当前节点已经处理过,跳过之 35 rep(i,0,G[v].size()-1){ 36 P go=G[v][i]; 37 if(dis[go.second]>dis[v]+go.first){ 38 dis[go.second]=dis[v]+go.first; 39 q.push(P(-dis[go.second],go.second)); 40 } 41 } 42 } 43 rep(i,1,n)printf("%d ",dis[i]); 44 return 0; 45 }
3.spfa【可处理负权边】
1 #include<iostream> 2 #include<cstdio> 3 #include<algorithm> 4 #include<queue> 5 #include<climits> 6 #include<vector> 7 #define rep(i,a,b) for(int i=a;i<=b;i++) 8 using namespace std; 9 typedef pair<int,int> P; 10 const int M=10001; 11 vector<P>G[M]; 12 queue<int>q; 13 int dis[M]; 14 bool f[M]={0};//记录节点i是否在队列中 15 int main(){//预处理同dijkstra 16 int n,m,s; 17 scanf("%d%d%d",&n,&m,&s); 18 rep(i,1,n)dis[i]=INT_MAX; 19 dis[s]=0; 20 rep(i,1,m){ 21 int u,v,l; 22 scanf("%d%d%d",&u,&v,&l); 23 G[u].push_back(P(v,l)); 24 } 25 q.push(s); 26 f[s]=1; 27 while(!q.empty()){ 28 int v=q.front();q.pop(); 29 f[v]=0; 30 rep(i,0,G[v].size()-1){ 31 P go=G[v][i]; 32 if(dis[go.first]>dis[v]+go.second){ 33 dis[go.first]=dis[v]+go.second; 34 if(!f[go.first]){//如果节点go.first被修改且其不在队列中,则将其加入队列 35 q.push(go.first); 36 f[go.first]=1; 37 } 38 } 39 } 40 } 41 rep(i,1,n)printf("%d ",dis[i]); 42 return 0; 43 }