背景:
第一道難度暫無評定的題。
第三個通過的。
題目傳送門:
https://www.luogu.org/problem/P3535
題意:
個點,條邊,刪掉最少的邊的數目,使得編號小於等於的點都不在環上。
思路:
容易想到若邊滿足,則這條邊是不用理的,暴力加到並查集中即可。
否則若有至少一個點的編號小於等於,若這兩點在環中,則至少要刪掉條邊使得它們不連通;否則讓它們聯通即可。
直接並查集判斷是否環即可。
代碼:
#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);
}