题解:CF1198C Matching vs Independent Set

Luogu CF

注意到 \(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;
}
posted @ 2025-07-21 13:58  FugiPig  阅读(20)  评论(0)    收藏  举报