luogu P3535 [POI2012]TOU-Tour de Byteotia

背景:

第一道難度暫無評定的題。
第三個通過的。

題目傳送門:

https://www.luogu.org/problem/P3535

題意:

nn個點,mm條邊,刪掉最少的邊的數目,使得編號小於等於kk的點都不在環上。

思路:

容易想到若邊(x,y)(x,y)滿足x,y>kx,y>k,則這條邊是不用理的,暴力加到並查集中即可。
否則若(x,y)(x,y)有至少一個點的編號小於等於kk,若這兩點在環中,則至少要刪掉11條邊使得它們不連通;否則讓它們聯通即可。
直接並查集判斷是否環即可。

代碼:

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
	int n,m,k,ans=0;
	int fa[1000010];
	struct node{int x,y;} a[1000010];
int find(int x)
{
	return x==fa[x]?x:fa[x]=find(fa[x]);
}
void Union(int x,int y)
{
	int t1=find(x),t2=find(y);
	if(t1!=t2) fa[t1]=t2;
}
int main()
{
	scanf("%d %d %d",&n,&m,&k);
	for(int i=1;i<=n;i++)
		fa[i]=i;
	for(int i=1;i<=m;i++)
	{
		scanf("%d %d",&a[i].x,&a[i].y);
		if(a[i].x>k&&a[i].y>k)
		{
			int t1=find(a[i].x),t2=find(a[i].y);
			if(t1!=t2) fa[t1]=t2;
		}
	}
	for(int i=1;i<=m;i++)
		if(a[i].x<=k||a[i].y<=k)
		{
			int t1=find(a[i].x),t2=find(a[i].y);
			if(t1!=t2) fa[t1]=t2; else ans++;
		}
	printf("%d",ans);
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章