Codeforces1198 C. Matching vs Independent Set(图论,匹配/独立集)

题意:

给定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;
}

猜你喜欢

转载自blog.csdn.net/weixin_44178736/article/details/107829678