直接枚举每条边,如果边加到图中后还是个匹配图,就直接加,反之就不加
这样加完所有边后,剩下的点必定可以组成一个独立集:因为如果剩下的点中还有互相匹配的,那么这对点应该在加边时就被算到匹配图中
所以要么是>=n的匹配图,要么是>=n的独立集,所以必定有解
#include<bits/stdc++.h> using namespace std; #define N 500005 struct Edge{int u,v;}e[N]; int n,m,f[N]; vector<int>ans; int main(){ int t;cin>>t; while(t--){ ans.clear(); scanf("%d%d",&n,&m); n*=3; for(int i=1;i<=n;i++)f[i]=0; for(int i=1;i<=m;i++){ scanf("%d%d",&e[i].u,&e[i].v); if(!f[e[i].u] && !f[e[i].v]){ ans.push_back(i); f[e[i].v]=f[e[i].u]=1; } } if(ans.size()>=n/3){ puts("Matching"); for(int i=0;i<n/3;i++) cout<<ans[i]<<" "; } else { puts("IndSet"); int cnt=0; for(int i=1;i<=n;i++){ if(!f[i]){ cout<<i<<" "; cnt++; if(cnt==n/3)break; } } } puts(""); } }
原文:https://www.cnblogs.com/zsben991126/p/11642834.html