codeforces1198C Matching vs Independent Set 思维

Posted aya-uchida

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了codeforces1198C Matching vs Independent Set 思维相关的知识,希望对你有一定的参考价值。

网址:http://codeforces.com/problemset/problem/1198/C

题意:

给出一个图包括$3*n$个点和$m$条边,一个边的集合定义如下,边的两端点只能属于一条边;一个点的集合定义如下:没有一条边把任意两个点连接。如果有这样的一个大小是$n$的边的集合,输出$"Matching"$和边按输入顺序的序号,如果有这样一个大小是$n$的点的集合,输出$”IndSet“$和点的序号,如果都没有,输出$”Impossible“$。($\sum n \leq 1e5,\sum m \leq 5e5$)。

题解:

直接判断一条边的端点是否已经被占用,没有则记录该边同时记录两端点已经被访问,然后判断是否有$n$条被记录的边,如果有,一定是$"Matching"$,如果没有,一定有一个$"IndSet"$。

(然后我TLE了至少$5$发,用多少$memset$多少,不要用C++流,不要用$vector$,直接数组模拟,缺一不可,否则都是TLE)。

AC代码:

#include <bits/stdc++.h>
using namespace std;
bool vis[300005];
int ans[500005];
int main()

    int T;
    scanf("%d",&T);
    while(T--)
    
        int n,m,u,v;
        scanf("%d%d",&n,&m);
        memset(vis,0,sizeof(vis[0])*3*(n+1));
        int num=0;
        for(int i=1;i<=m;++i)
        
            scanf("%d%d",&u,&v);
            if(!vis[u]&&!vis[v])
            
                vis[u]=vis[v]=1;
                ans[num++]=i;
            
        
        if(num<n)
        
            printf("IndSet\n");
            int pos=0;
            for(int i=1;i<=3*n&&pos<n;++i)
                if(!vis[i])
                    printf("%d%c",i,(++pos==n?‘\n‘:‘ ‘));
        
        else
        
            printf("Matching\n");
            for(int i=1;i<=n;++i)
                printf("%d%c",ans[i-1],(i==n?‘\n‘:‘ ‘));
        
    
    return 0;

 

以上是关于codeforces1198C Matching vs Independent Set 思维的主要内容,如果未能解决你的问题,请参考以下文章

Codeforces 1038E Maximum Matching

Codeforces 1032F Vasya and Maximum Matching dp

CodeForces - 1476E Pattern Matching(字典树+拓扑)

C. Rotation Matching1400 / 思维 数组循环移动

$Codeforces; Round; 504; (Div.2)$

Educational Codeforces Round 147 (A-D)