题意:
给定n,m,表示有n*3个点和m条边.
要求找到大小为n的匹配或者大小为n的独立集
数据范围:n<=1e5,m<=3e5
解法:
给定的m条边,如果两端点都没有被标记,则作为匹配边然后标记
如果最后匹配边>=n,则输出大小为n的匹配
否则说明剩下的非匹配点一定是>n的,而且两两之间没有连边,
任意找n个输出即可
code:
#include<bits/stdc++.h>
using namespace std;
const int maxm=1e6+5;
int mark[maxm];
int n;
signed main(){
int T;scanf("%d",&T);
while(T--){
int n,m;scanf("%d%d",&n,&m);
for(int i=1;i<=n*3;i++)mark[i]=0;
vector<int>temp;
for(int i=1;i<=m;i++){
int a,b;scanf("%d%d",&a,&b);
if(!mark[a]&&!mark[b]){
temp.push_back(i);
mark[a]=mark[b]=1;
}
}
if((int)temp.size()>=n){
puts("Matching");
for(int i=0;i<n;i++){
printf("%d ",temp[i]);
}
puts("");
}else{
puts("IndSet");
int cnt=0;
for(int i=1;i<=n*3;i++){
if(!mark[i]){
printf("%d ",i);
cnt++;
if(cnt==n)break;
}
}
puts("");
}
}
return 0;
}