思维构造+匹配——cf1199E

直接枚举每条边,如果边加到图中后还是个匹配图,就直接加,反之就不加

这样加完所有边后,剩下的点必定可以组成一个独立集:因为如果剩下的点中还有互相匹配的,那么这对点应该在加边时就被算到匹配图中

所以要么是>=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("");
    }
} 

 

posted on 2019-10-09 16:51  zsben  阅读(115)  评论(0编辑  收藏  举报

导航