【算法】贪心算法-最小生成树

    • 给定一个有nn个点的无向图,其中有mm条权值为wiwi​的边,问该图的最小生成树的费用为多少。

  • Input

    • 第一行给定两个整数分别为nn,mm,分别代表完全图中有nn个点,有mm条权值为aiai​的边

    • 后面输入有mm行,每行三个值uu,vv,ww代表从uu到vv有一条权值为ww的边

  • Output

    • 最小生成树的费用,如果无法生成最小生成树,则输出Imp

  • Sample Input 1

2 0
  • Sample Output 1

Imp
  • Sample Input 2 

3 2
1 2 2
1 3 3
  • Sample Output 2

5


  • 代码部分:

  • 

#include <stdio.h>

#define maxnum 10000000
#define maxarray 1000

int u[maxarray];
int v[maxarray];
int w[maxarray];
int ifvisited[maxarray];
int map[maxarray][maxarray];
int m,n;
int vodei=-1;
int vodej=-1;
int cost=0;

int findmin(){
	int temp=maxnum;
	vodei=-1;
	vodej=-1;
	for(int i=1;i<=n;i++){
		for(int j=1;j<=n;j++){
			if(map[i][j]<temp && map[i][j]>0){
				if(ifvisited[i]!=ifvisited[j]){
					temp=map[i][j];
					vodei=i;
					vodej=j;
				}
			}
		}
	}
	ifvisited[vodei] = 1;
	ifvisited[vodej] = 1;
	return temp;
}

void Prim(){
	ifvisited[1]=1;
	for(int k=1;k<=n-1;k++){
		cost += findmin();
		if (vodei == -1 || vodej == -1) { // 找不到边,图不连通
            printf("Imp");
            return;
        }
	}
	printf("%d",cost);
	return;
}

int main(){
	scanf("%d",&n);
	scanf("%d",&m);
	for(int i=1;i<=m;i++){
		scanf("%d",&u[i]);
		scanf("%d",&v[i]);
		scanf("%d",&w[i]);
	}
	for(int i=1;i<=m;i++){
		map[u[i]][v[i]]=w[i]; 
	}
	Prim(); 
	return 0;
}

本文中此代码采用Prim树的生成方式,即先确定一个初始节点,再依次引入其周围的最小边节点(须为非环节点)即可以生长树的形式生成最小生成树。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值