首页 > 其他 > 详细

思维构造+匹配——cf1199E

时间:2019-10-09 17:40:43      阅读:87      评论:0      收藏:0      [点我收藏+]

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

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

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

 

思维构造+匹配——cf1199E

原文:https://www.cnblogs.com/zsben991126/p/11642834.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!