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 }