链接
https://codeforces.com/contest/1198/problem/C
题解
做这题还是要对图论有一定的熟悉
其实就类似于图论中对“极大独立集是极小支配集”的证明类似,当你随便选出一个极大匹配时,去掉所选边关联的点,剩下的点就构成一个独立集
那么对于这题,我只要随便选边,如果能选出一个大小为
n
n
n的匹配,就直接输出,如果选不出来,那剩下的点就超过
n
n
n个,随便选
n
n
n个就时一个独立集
代码
#include<bits/stdc++.h>
#define maxn 300010
#define linf (1ll<<60)
#define iinf 0x3f3f3f3f
#define eps 1e-8
#define cl(x) memset(x,0,sizeof(x))
#define mod 998244353ll
using namespace std;
typedef long long ll;
int vis[maxn], n, m;
vector<int> ans;
int main()
{
ll i, j, u, v, T;
ios::sync_with_stdio(false);
cin>>T;
while(T--)
{
cin>>n>>m;
for(i=1;i<=3*n;i++)vis[i]=false;
ans.clear();
for(i=1;i<=m;i++)
{
cin>>u>>v;
if(!vis[u] and !vis[v])ans.emplace_back(i), vis[u]=vis[v]=true;
}
if(ans.size()>=n)
{
cout<<"Matching\n";
for(i=0;i<n;i++)cout<<ans.at(i)<<' ';
cout<<'\n';
}
else
{
int cnt=0;
cout<<"IndSet\n";
for(i=1;i<=3*n and cnt<n;i++)
{
if(vis[i]==false)cout<<i<<' ', cnt++;
}
cout<<'\n';
}
}
return 0;
}