(图论)最小生成树+入门题

本文详细介绍了数据结构中的重要概念——最小生成树,并通过Prim算法和Kruskal算法进行解析,包括多个AC代码实例,帮助理解如何解决实际问题。内容涵盖了从基础的裸题到复杂的实际应用,适合学习和复习最小生成树算法。
摘要由CSDN通过智能技术生成

数据结构真的重要!!!所以记入下来,以后留给学弟看!

最小生成树(普里姆算法—Prim算法)+(克鲁斯卡尔算法) 实在是觉得Kruskal算法。。。。

板子的话!等我写Kruskal的时候补上

板子

Prim持续等待更新!!!复杂度 O(n*n)
算法:最小生成树Kruskal 复杂度 O(E)
最小生成树裸题

题目传送门POJ1251
题意:给定n,接下来n-1行,每一行表示这个树跟其他点相连的距离!!!然根本不需要考虑重边!!!直接裸题!!!

AC代码

//#include<bits/stdc++.h>
#include<iostream>
#include<algorithm>
#include<cmath>
#include<cstdio>
#include<cctype>
#include<cstdlib>
#include<cstring>
#include<string>
#include<set>
#define sa(t) scanf("%d",&t)
#define SA(t) scanf("%lld", %t)
#define PF(t) printf("%lld",t)
#define pf(t) printf("%d", t)
#define PFF(t) printf("%lld\n",t)
#define pff(t) printf("%d\n", t)
typedef long long int ll;

void read(int &x)
{
    int f=1;x=0;char s=getchar();
    while(s<'0'||s>'9'){if(s=='-')f=-1;s=getchar();}
    while(s>='0'&&s<='9'){x=x*10+s-'0';s=getchar();}
    x*=f;
}
using namespace std;
const int maxn = 10004;
int fa[maxn];

int Find(int x){
	if(fa[x] == x)
		return x;
	else
		return fa[x] = Find(fa[x]);
}
struct node{
	int a,b,val;
}pp[maxn];
bool cmp(node a, node b){
	return a.val < b.val;
}
void init(int n){
	for(int i = 0; i <= n+1; i++)
		fa[i] = i;
}
int main(){
	
	int n;
	while(cin>>n,n){
		if( n == 0 )
			break;
		init(n);
		char x,y;
		int m,mm;
		int cnt = 0, ans = 0;
		for(int i = 1; i < n; i++){
			cin>>x>>m;
			for(int j = 1; j <=m;j++){
				cin>>y>>mm;
				pp[cnt].val =mm;
				pp[cnt].a = x-'A'; 
				pp[cnt].b = y - 'A';
				cnt++; 
			}
		}
		sort(pp,pp+cnt,cmp);
		for(int i = 0; i < cnt; i++){
			int x = pp[i].a;
			int y = pp[i].b;
			if(Find(x) != Find(y)){
				fa[Find(x)] = Find(y);
				ans = ans + pp[i].val; 
			}
		}
		pff(ans);
	}
	return 0;
} 

最小生成树第一题

题目传送门POJ1287
题意: n,m表示的就是n颗树,接下来m条边,然后套…
我的理解: 我感觉我不改做这个数据结构专题的!!!(⊙o⊙)…
这个题目吧!我开始想错了!我看了有重边!本来想去重边!后来我发现了!完全不需要!!还是菜!!继续刷吧!!!

AC代码

//#include<bits/stdc++.h>
#include<iostream
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值