1.Floyd(多源点最短路径)
#include<cstdio>
#include<cstdlib>
#include<cstring>
using namespace std;
int n,m,dist[110][110];
int main()
{
scanf("%d%d",&n,&m);
memset(dist,0x3f,sizeof(dist));
for (int a=1;a<=n;a++)
dist[a][a] = 0;
for (int a=1;a<=m;a++)
{
int s,e,d;
scanf("%d%d%d",&s,&e,&d);
dist[s][e]=min(dist[s][e],d);
}
for (int i=1;i<=n;i++)
for (int j=1;j<=n;j++)
for (int k=1;k<=n;k++)
dist[j][k] = min(dist[j][k], dist[j][i]+dist[i][k]);
}
2.dijkstra(O(n^2))
#include<cstdio>
#include<cstdlib>
#include<cstring>
using namespace std;
int dist[maxn];
bool right[maxn];
void dijkstra(int s)
{
memset(dist,0x3f,sizeof(dist));
dist[s]=0;
for (int a=1;a<=n;a++)
{
int p=-1;
for (int b=1;b<=n;b++)
if (!right[b] && (p==-1 || dist[b]<dist[p])) p=b;
right[p]=true;
for (int b=first[p];b!=0;b=ed[b].next)
{
int e=ed[b].e,d=ed[b].d;
dist[e] = min(dist[e],dist[p]+d);
}
}
}
int main()
{
scanf("%d%d",&n,&m);
for (int a=1;a<=m;a++)
{
int s,e,d;
scanf("%d%d%d",&s,&e,&d);
add_edge(s,e,d);
}
dijkstra(1);
return 0;
}
3.dijkstra堆优化(O((n+m)*log(n+m)))
#include<iostream>
#include<queue>
#include<stdio.h>
using namespace std;
struct node{
int p,d;
};
bool operator<(const node &a,const node &b){
return a.d>b.d;
}
priority_queue<node>q;
struct rec{
int e,d,nex;
}a[500010];
long long dis[100010];
int n,m,s,en,first[100010];
bool vis[100010];
void add(int x,int y,int z){
en++;
a[en].e=y;
a[en].d=z;
a[en].nex=first[x];
first[x]=en;
}
long long f(int x,int y){
if (y==0) return 1;
long long v=f(x,y>>1);
v=v*v;
if (y&1==1){
v*=x;
}
return v;
}
void dj(int ccf){
for (int i=1;i<=n;i++) dis[i]=f(2,31)-1;
dis[ccf]=0;
for (int i=1;i<=n;i++){
node x;
x.p=i;
x.d=dis[i];
q.push(x);
}
for (int j=1;j<=n;j++){
while (vis[q.top().p]==true){
q.pop();
}
node x=q.top();
q.pop();
int p=x.p;
vis[p]=true;
for (int i=first[p];i!=0;i=a[i].nex){
int e=a[i].e;
int d=a[i].d;
if (dis[e]>dis[p]+d){
dis[e]=dis[p]+d;
node y;
y.p=e;
y.d=dis[e];
q.push(y);
}
}
}
}
int main(){
scanf("%d%d%d",&n,&m,&s);
for (int i=1;i<=m;i++){
int x,y,z;
scanf("%d%d%d",&x,&y,&z);
add(x,y,z);
}
dj(s);
for (int i=1;i<=n;i++){
printf("%lld ",dis[i]);
}
return 0;
}
4.Bellman-Ford(O(nm))
#include<iostream>
#include<stdio.h>
using namespace std;
int n,m,st,s[500010],e[500010],d[500010];
long long dis[100010];
long long f(int x,int y){
if (y==0) return 1;
long long v=f(x,y>>1);
v=v*v;
if (y&1==1){
v=v*x;
}
return v;
}
int main(){
scanf("%d%d%d",&n,&m,&st);
for (int i=1;i<=m;i++){
scanf("%d%d%d",&s[i],&e[i],&d[i]);
}
for (int i=1;i<=n;i++){
dis[i]=f(2,31)-1;
}
dis[st]=0;
for (int i=1;i<n;i++){
for (int j=1;j<=m;j++){
dis[e[j]]=min(dis[e[j]],dis[s[j]]+d[j]);
}
}
for (int i=1;i<=n;i++){
printf("%lld ",dis[i]);
}
return 0;
}
5.SPFA(O(km))(慎用)
#include<stdio.h>
#include<algorithm>
#include<queue>
using namespace std;
struct rec{
int e,d,nex;
}a[500010];
int n,m,s;
int cnt[100010];
queue<int>q;
int en,first[100010];
bool vis[100010];
long long dis[100010];
void add(int x,int y,int z){
en++;
a[en].d=z;
a[en].e=y;
a[en].nex=first[x];
first[x]=en;
}
long long f(int x,int y){
if (y==0) return 1;
long long v=f(x,y>>1);
v=v*v;
if (y&1==1){
v=v*x;
}
return v;
}
void spfa(int st){
for (int i=1;i<=n;i++){
dis[i]=f(2,31)-1;
}
dis[st]=0;
vis[st]=true;
q.push(st);
while (!q.empty()){
int p=q.front();
q.pop();
vis[p]=false;
for (int i=first[p];i!=0;i=a[i].nex){
int e=a[i].e;
int d=a[i].d;
if (dis[e]>dis[p]+d){
dis[e]=dis[p]+d;
if (vis[e]==false){
vis[e]=true;
q.push(e);
}
}
}
}
}
int main(){
scanf("%d%d%d",&n,&m,&s);
for (int i=1;i<=m;i++){
int x,y,z;
scanf("%d%d%d",&x,&y,&z);
add(x,y,z);
}
spfa(s);
for (int i=1;i<=n;i++){
printf("%lld ",dis[i]);
}
return 0;
}