最短路 算法总结

一、Floyd

int n;
void floyd(){
    
    
	for(int k=1;k<=n;k++){
    
    
		for(int i=1;i<=n;i++){
    
    
			for(int j=1;j<=n;j++){
    
    
				if(maps[i][j]>maps[i][k]+maps[k][j]){
    
    
					maps[i][j]=maps[i][k]+maps[k][j];
				}
			}
		}
	}
}

二、Dijkstra

#define INF 0x3f3f3f3f
int n,m;
int dis[M];
int vis[M];
int maps[M][M];
void init(){
    
    
	for(int i=1;i<=n;i++){
    
    
		for(int j=1;j<=n;j++){
    
    
			maps[i][j]=INF;
		}
		maps[i][i]=0;
	}
	memset(vis,0,sizeof(vis));
}
void dijkstra(int s){
    
    
	for(int i=1;i<=n;i++) dis[i]=INF;
	dis[s]=0;
	for(int i=1;i<=n;i++) dis[i]=maps[s][i];
	for(int i=1;i<=n;i++){
    
    
		int Min=INF,k;
		for(int j=1;j<=n;j++){
    
    
			if(!vis[j]&&Min>dis[j]) Min=dis[j],k=j;
		}
		vis[k]=1;
		for(int j=1;j<=n;j++){
    
    
			if(!vis[j]&&dis[j]>maps[k][j]+dis[k]) dis[j]=maps[k][j]+dis[k];
		}
	}
}
//dijkstra(1) 指的是选定1为源点
//cout<<dis[n] 指的是输出 1 到 n 的最短距离	

三、Bellman_ford

#define M 105
#define INF 0x3f3f3f3f
struct node{
    
    
    int u,v,w;
}edge[M];
int dis[M];
int n,m,s;
void init(){
    
    
    cin>>n>>m>>s;
    for(int i=1;i<=n;i++){
    
    
        dis[i]=INF;
    }
    dis[s]=0;
    for(int i=1;i<=m;i++){
    
    
        cin>>edge[i].u>>edge[i].v>>edge[i].w;
        if(edge[i].u==s){
    
    
            dis[edge[i].v]=edge[i].w;
        }
    }
}
bool bellmanford(){
    
    
    for(int i=1;i<=n;i++){
    
    
        for(int j=1;j<=m;j++){
    
    
            if(dis[edge[j].v]>dis[edge[j].u]+edge[j].w){
    
    
                dis[edge[j].v]=dis[edge[j].u]+edge[j].w;
            }
        }
    }
    int flag=1;
    for(int i=1;i<=m;i++){
    
    
        if(dis[edge[i].v]>dis[edge[i].u]+edge[i].w){
    
    
            flag=0;
            break;
        }
    }
    return flag;
}
//nodenum 节点数
//edgenum 边数
//source  源点
//distance 距离

本来想细细地写一下思路,就简单说一下吧。
迪杰斯特拉和贝尔曼的区别就是一个用点找最短路,一个用边找最短路,单源点,选定之后先找出此点直接相连的各个点的边权,然后进行比较,为啥是双循环,因为一次松弛一下,全来一遍准确,还有spfa,之后补上。
写的都是板子,这两天刚开始学,说错的写错的之后再改吧。

猜你喜欢

转载自blog.csdn.net/iuk11/article/details/108403425
今日推荐