[Ejemplo 1 del capítulo 11 de Ybtoj] Ciudad ocupada [Árbol de expansión mínimo]

Inserte la descripción de la imagen aquí
Inserte la descripción de la imagen aquí
Inserte la descripción de la imagen aquí
Inserte la descripción de la imagen aquí
Inserte la descripción de la imagen aquí


Ideas para resolver problemas

Para la pregunta de plantilla de árbol de expansión mínima, se pueden usar tanto prim como kruskal. Esta pregunta nos dice directamente el lado, y kruskal es más conveniente para ser codicioso al lado.

Recomendación de blog:

PD: Creo que es el más utilizado.


Código

#include<iostream>
#include<cstdio>
#include<iomanip>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<bitset>
using namespace std;

int n,m,x,y,w,ans,k,fa[310];

struct c{
    
    
	int x,y,w;
}a[310];

bool cmp(c l,c r)
{
    
    
	return l.w<r.w;
}

int find(int x)
{
    
    
	if(x==fa[x])return x;
	else return fa[x]=find(fa[x]);
}

int main(){
    
    
	scanf("%d%d",&n,&m);
	for(int i=1;i<=m;i++)
		scanf("%d%d%d",&a[i].x,&a[i].y,&a[i].w);
	sort(a+1,a+m+1,cmp);
	for(int i=1;i<=n;i++)	
		fa[i]=i;
	printf("%d ",n-1);
	for(int i=1;i<=m;i++)
	{
    
    
		int p=find(a[i].x),q=find(a[i].y);
		if(p!=q)
		{
    
    
			fa[p]=q;
			ans=max(ans,a[i].w);
			k++;
			if(k==n-1)
			{
    
    
				printf("%d",ans);
				return 0;	
			}
		}
	}
}

Supongo que te gusta

Origin blog.csdn.net/kejin2019/article/details/115259000
Recomendado
Clasificación