最短路径(Dijkstra算法和Floyd算法)

源代码:

#include<bits/stdc++.h>
#define M 20
#define N 5000
using namespace std;
typedef struct{
	char vexs[M];
	int edges[M][M];
	int n,e;
}mgraph;
typedef int dist[M];
typedef int path[M];
typedef int dis[M][M];
typedef int pat[M][M];
void creat(mgraph *g,int c){
	cout<<"Please input the value of n,e:";
	cin>>g->n>>g->e;
	int i,j,w;
	cout<<"Please input the data of nodes:";
	for(i=0;i<g->n;i++)cin>>g->vexs[i];
	for(i=0;i<M;i++){
		for(j=0;j<M;j++){
			if(i==j)g->edges[i][j]=0;
			else g->edges[i][j]=N;
		}
	}
	for(int k=0;k<g->e;k++){
		cout<<"Please input the value of i,j,w:";
		cin>>i>>j>>w;
		g->edges[i][j]=w;
		if(c==0)g->edges[j][i]=w;
	}
}

//Dijkstra算法 
void dijkstra(mgraph g,int v0,path p,dist d){
	bool final[M];
	int i,k,j,v,minn;
	for(v=0;v<g.n;v++){
		final[v]=false;
		d[v]=g.edges[v0][v];
		if(d[v]!=0&&d[v]<N)p[v]=v0;
		else p[v]=-1;
	}
	final[v0]=true;
	d[v0]=0;
	for(i=1;i<g.n;i++){
		minn=N;
		for(k=0;k<g.n;k++){
			if(!final[k]&&d[k]<minn){
				v=k;minn=d[k];
			}
		}
		cout<<g.vexs[v]<<" "<<minn<<endl;
		if(minn==N)return;
		final[v]=true;
		for(k=0;k<g.n;k++){
			if(!final[k]&&(minn+g.edges[v][k])<d[k]){
				d[k]=minn+g.edges[v][k];
				p[k]=v;
			}
		}
	}
}
void print_gpd(mgraph g,path p,dist d){
	int st[M],i,pre,top;
	for(i=0;i<g.n;i++){
		top=-1;
		cout<<"Distanced "<<d[i]<<":";
		st[++top]=i;
		pre=p[i];
		while(pre!=-1){
			st[++top]=pre;
			pre=p[pre];
		}
		while(top>=0){
			cout<<st[top--]<<" ";
		}
		cout<<endl;
	}
}

//Floyd算法 (所有顶点对的最短路径)
void floyd(mgraph g,pat p,dis d){
	int i,j,k;
	for(i=0;i<g.n;i++){
		for(j=0;j<g.n;j++){
			d[i][j]=g.edges[i][j];
			if(i!=j&&d[i][j]<N)p[i][j]=i;
			else p[i][j]=-1;
		}
	}
	for(k=0;k<g.n;k++){//递推求解每一对顶点间的最短距离
		for(i=0;i<g.n;i++){
			for(j=0;j<g.n;j++){
				if(d[i][j]>(d[i][k]+d[k][j])){
					d[i][j]=d[i][k]+d[k][j];
					p[i][j]=p[k][j];
				}
			}
		}
	}
}
void outputpath(mgraph g,pat p,dis d){
	int i,j,k,v;
	int s[M],top;
	for(i=0;i<g.n;i++){
		for(j=0;j<g.n;j++){
			if(d[i][j]!=N&&i!=j){
				printf("The distance of path from%dto%dis:%d\t",i,j,d[i][j]);
				cout<<"The path:";
				k=p[i][j];
				top=0;
				s[top]=j;//最短路径的终点
				while(k!=-1&&k!=i){//寻找路径的中间顶点。
					top++;
					s[top]=k;
					k=p[i][k];
				}
				s[++top]=i;//最短路径的节点
				while(top>0)cout<<s[top--]<<" ";
				cout<<s[top]<<endl;
			}
		}
	}
}
int main(){
	mgraph g;
	path p;dist d;
	pat p1;dis d1;
	int v0;
	creat(&g,1);
	cout<<"Dijkstra算法"<<endl;
	cout<<"Please input the soure point v0:";
	cin>>v0;
	dijkstra(g,v0,p,d);
	print_gpd(g,p,d);
	cout<<"Floyd算法"<<endl;
	floyd(g,p1,d1);
	outputpath(g,p1,d1);
	return 0;
}

运行结果: 

 

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值