题解:CF1198C Matching vs Independent Set
注意到 \(3n\) 是一个很好的性质,但是不好从点入手。
考虑从边入手,思考如何找匹配。先假设随便找一个极大的匹配 \(S\),若 \(|S|\ge n\),那么就得到一组解;否则通过惊人的注意力可以发现这 \(|S|\) 条边占用了 \(2|S|<2n\) 个点,注意到一共有 \(3n\) 个点,那么会剩下 \(>n\) 个点,那么就找到一个点独立集了。
Code:
#include<iostream>
#define rep(i,l,r) for(int i=(l);i<=(r);i++)
#define per(i,l,r) for(int i=(l);i>=(r);i--)
using namespace std;
const int maxn=3e5+5,maxm=5e5+5;
bool vis[maxn];
int ans[maxm];
int main(){
int it;
cin>>it;
while(it--){
int in,im;
scanf("%d %d",&in,&im);
rep(v1,1,in*3)vis[v1]=false;
int cnt=0;
rep(v1,1,im){
int iu,iv;
scanf("%d %d",&iu,&iv);
if(!vis[iu]&&!vis[iv]){
ans[++cnt]=v1;
vis[iu]=vis[iv]=true;
}
}
if(cnt>=in){
printf("Matching\n");
rep(v1,1,in)printf("%d%c",ans[v1],v1!=in?' ':'\n');
}
else{
printf("IndSet\n");
cnt=0;
rep(v1,1,in*3)if(!vis[v1]){
printf("%d%c",v1,(++cnt)!=in?' ':'\n');
if(cnt==in)break;
}
}
}
return 0;
}

浙公网安备 33010602011771号