三种路径算法


三种最短路径算法(未完成)

Dijkstra算法(未完成)

用于计算一个原点到其他点的最短路径 (不适用于有负数的权重)

初始化:

G[][2]二维数组存储 邻接矩阵 (如果权重没有0,那么没有边相连的存0可以,反之存无穷大)

dist[i]数组存储从原点到点i的最小距离 ,初始时 dist[原点] =0 ,dist[原点相连接的点]= 距离(权重),dist[其余的点]=无穷大

n=节点数,m=边数

p[i] = i这个点的前驱点

vis[i]= i这个点是否加入S集合 bool型

首先分为两个集合 S 和 V-S 其中每考虑完一个节点就把那个节点加入S集合。

1.找最小

2.更新

O(n^2)的时间复杂度 用优先队列写可以优化到O(nlogn)

#include<iostream>
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define endl "\n"
typedef pair<int ,int> pii; 
const int M=999999;

int p[10],G[10][10],dist[10];
int n=5 ,m=8 ; //节点数,边数 
bool vis[10];

void dijkstra(int u){
	for(int i=1;i<n;++i){
		int tmp=M,t=u;
		for(int j=1;j<=n;++j){
			if(!vis[j]&&dist[j]<tmp){
				tmp=dist[j];
				t=j;
			}
		}
		if(t==u) return;
		vis[t]=1;
		for(int j=1;j<=n;++j){
			if(!vis[j]&&dist[j]>dist[t]+G[t][j]&&G[t][j]!=0){
				dist[j]=dist[t]+G[t][j];
				p[j]=t;
			}
		}
	}
}
void pri(int u){
	G[1][2]=2;
	G[1][3]=5;
	G[2][4]=6;
	G[2][3]=2;	
	G[3][4]=7;	
	G[3][5]=1;	
	G[4][3]=2;	
	G[4][5]=4;
	for(int i=1;i<n;++i){
		dist[i]==G[u][i];
		if(dist[i]==0)
			p[i]=u;
	}	
	vis[1]=1;
	memset(dist,M,sizeof(dist));
	dist[2]=2;
	dist[1]=0;
	dist[3]=5;
	p[3]=1;
	p[2]=1; 
}
void findp(int u){
	if(u==-1)
		return ;
		findp(p[u]);
		cout<<u<<" ";
}
int main(){
	pri(1);
	dijkstra(0);
	cout<<dist[5];
	return 0;
} 

Bellman-ford算法

Floyd算法

用于计算各个顶点之间的最短路径

#include<iostream>
#include<bits/stdc++.h>
using namespace std;
#define int long long
#define endl "\n"
typedef pair<int ,int> pii; 
const int M=38758200196842127;
int G[2050][2050],dis[2050],p[2050];
bool vis[2050];
int n=2021;

int gcd(int a,int b){
	if(b==0) return a;
	else return gcd(b,a%b);
}
void fun(){
	//memset(dis,M,sizeof(int)*2050);
	for(int i=1;i<=n;i++){
		dis[i]=M;
		for(int j=1;j<=n;j++){
			if(i-j>21||i-j<-21)
				continue;
			G[i][j]=i/gcd(i,j)*j;
			G[j][i]=i/gcd(i,j)*j;
		}
	}
	for(int i=1;i<=n;i++){
		if(G[1][i]!=0)
			dis[i]=G[1][i];
	}
	vis[0]=1;
	vis[1]=1;
	
}

void fun2(int u){
	for(int i=1;i<n;i++){
		int tep=M,t=u;
		for(int j=1;j<=n;++j){
			if(!vis[j]&&dis[j]<tep){
				tep=dis[j];
				t=j;
			}
		}
		if(t==u) return;
		vis[t]=1;
		for(int j=1;j<=n;++j){
			if(!vis[j]&&dis[j]>dis[t]+G[t][j]&&G[t][j]!=0){
				dis[j]=dis[t]+G[t][j];
				p[j]=t;
			}
		}
	}
	
}
signed main(){
	fun();
	
	fun2(0);
	cout<<dis[2021]<<endl;	
	return 0;
}

#include
#include<bits/stdc++.h>
#define endl “\n”
#define ll long long
using namespace std;
typedef pair<int,int> pii;

int main(){
ios::sync_with_stdio(0);
cin.tie(0);

return 0;

}


文章作者: StyleWave
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 StyleWave !
  目录