贪心:最小生成树(prim算法和kruskal算法)+dijstra算法(单源最短路径)

使用prim算法和kruskal算法求下图的最小生成树 

使用dijstra算法求下图的所有顶点对之间的最短路径 

均需按边选择的顺序输出被选出的边图中有顶点{v0,v1,v2,v3,v4,v5} 

有下面的边 
       (v0 v1 34 )
       (v0 v2 46 )
       (v0 v5 19 )
       (v1 v4 12 )
       (v2 v3 17 )   
       (v2 v5 25 )
       (v3 v4 38 )
       (v3 v5 25 )  
       (v4 v5 26 ) 

kruskal算法

#include<iostream>
#define N 6
#define B 9
using namespace std;

struct Edge{
	int begin;
	int end;
	int weight;
};
//邻接表,权值从小到大排序 
Edge edge[B]={	{1,4,12},{2,3,17},{0,5,19},
        		{2,5,25},{3,5,25},{4,5,26},
				{0,1,34},{3,4,38},{0,2,46}	};

int parent[N-1];//各顶点根节点 

int find(int n){//返回n的根节点 
	while(parent[n]>0){
		n=parent[n];
	}
	return n;
}

void kruskal(){
	int choose=0; 
	for(int i=0;i<B&&choose<N-1;i++){//遍历所有边 
		int n=find(edge[i].begin);//找根节点 
		int m=find(edge[i].end);//找根节点 
		if(n!=m){//根节点不相同,把一个当孩子节点 
			parent[n]=m;//更新根节点 
			choose++;
			cout<<edge[i].begin<<"->"<<edge[i].end<<":"<<edge[i].weight<<endl;//输出以选边 
		}
	}
	if(choose<N-1)
	    printf("图不连通没有最小生成树!\n"); 
}

int main(){
	kruskal();
} 

prim算法:

#include<iostream>
#define N 6
#define M 65535
using namespace std;
//邻接矩阵 
int bian[N][N]={	{0,34,46,M,M,19},
                    {34,0,M,M,12,M},
					{46,M,0,17,M,25},
					{M,M,17,0,38,25},
					{M,12,M,38,0,26},
					{19,M,25,25,26,0}	};
int nowBianJH[N];//存储当前点到各点的最短距离 
int minDianJH[N];//存储到达最短距离坐标 

void prim(int n){
	for(int i=0;i<N;i++){//初始化当前点的数据 
		nowBianJH[i]=bian[n][i];
		minDianJH[i]=n;
	}
	for(int i=1;i<N;i++){//找其他N-1个点的数据 
		int min=M,min_i=-1;
		for(int j=0;j<N;j++){
			if(nowBianJH[j]!=0&&nowBianJH[j]<min){//假如有更短距离
				min=nowBianJH[j];//更新距离 
				min_i=j;//更新下一个节点 
			}
		}
		cout<<minDianJH[min_i]<<"->"<<min_i<<":"<<min<<endl;//输出找到的最短长度 
		nowBianJH[min_i]=0;//无须再寻找min_i位置距离,置为0判断跳过 
		for(int k=0;k<N;k++){//更新新节点带来的数据 
			if(nowBianJH[k]!=0&&bian[min_i][k]<nowBianJH[k]){
				nowBianJH[k]=bian[min_i][k];//更新更短距离 
				minDianJH[k]=min_i;//更新到达距离的坐标 
			}
		}
	}
}

int main(){
	prim(2);
}

dijstra算法:

#include<iostream>
#define N 6
#define M 65535
using namespace std;
//邻接矩阵 
int bian[N][N]={	{0,34,46,M,M,19},
                    {34,0,M,M,12,M},
					{46,M,0,17,M,25},
					{M,M,17,0,38,25},
					{M,12,M,38,0,26},
					{19,M,25,25,26,0}	};
int nowBianJH[N];//存储当前点到各点的最短距离 
int minDianJH[N];//存储到达最短距离坐标 
int tag[N];//标记点是否已经找过 

void trackPath(int n){
	for(int i=0;i<N;i++){
		int k=i;
		cout<<n<<"->";
		while(minDianJH[k]!=n){
			cout<<minDianJH[k]<<"->";
			k=minDianJH[k];
		}
		cout<<i<<":"<<nowBianJH[i]<<endl;
	}
}

void dijkstra(int n){
	tag[n]=1;
	for(int i=0;i<N;i++){//初始化当前点的数据 
		nowBianJH[i]=bian[n][i];
		minDianJH[i]=n;
	}
	for(int i=1;i<N;i++){//找其他N-1个点的数据 
		int min=M,min_i=-1;
		for(int j=0;j<N;j++){
			if(tag[j]!=1&&nowBianJH[j]<min){//假如有更短距离
				min=nowBianJH[j];//更新距离 
				min_i=j;//更新下一个节点 
			}
		}
		tag[min_i]=1;//标记min_i点已经找过,置为1判断跳过 
		for(int k=0;k<N;k++){//更新新节点带来的数据 
			if(tag[k]!=1&&bian[min_i][k]+min<nowBianJH[k]){
				nowBianJH[k]=bian[min_i][k]+min;//更新更短距离 
				minDianJH[k]=min_i;//更新到达距离的坐标 
			}
		}
	}
	trackPath(n);
}

int main(){
	dijkstra(5);
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值