10.24新生赛I题 营救(P1396)

营救 - 洛谷https://www.luogu.com.cn/problem/P1396错题

题解:

直接进行Kruskal

将边从小到大排序后

进行合并操作,

不需要考虑前面的这些边是否会经过

因为若当前s到t不连通,则s到t一定有一条更长的边会覆盖当前的最大权值。

#include<stdio.h>
#include<iostream>
#include<cstdlib>
#include<string.h>
#include<algorithm>
using namespace std;
int n,m,s,t;
const int N=1e5+10;
struct node
{
	int a,b,c;
}e[N];
bool com(node a,node b)
{
	return a.c<b.c;
}
int p[N];
int find(int x)
{
	if(p[x]!=x) p[x]=find(p[x]);
	return p[x];
	
}
int main()
{
	//freopen("uva.txt","r",stdin);
	cin>>n>>m>>s>>t;
	
	for(int i=1;i<=m;i++)
	{
		int a,b,c;
		scanf("%d%d%d",&a,&b,&c);
		e[i]={a,b,c};
	}
	sort(e+1,e+m+1,com);
	for(int i=1;i<=n;i++) p[i]=i;
	int ans=0;
	for(int i=1;i<=m;i++)
	{
		int a=find(e[i].a),b=find(e[i].b);
		if(a!=b)
		{
			p[a]=b;
			if(find(s)==find(b))
			{
				ans=max(ans,e[i].c);
			}
			if(find(s)==find(t))
			{
				printf("%d",ans);
				break;
			}
		}
	}
	return 0;
}

posted @ 2022-09-17 19:35  LZH_03  阅读(13)  评论(0编辑  收藏  举报