• 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
    ");
                int pos=0;
                for(int i=1;i<=3*n&&pos<n;++i)
                    if(!vis[i])
                        printf("%d%c",i,(++pos==n?'
    ':' '));
            }
            else
            {
                printf("Matching
    ");
                for(int i=1;i<=n;++i)
                    printf("%d%c",ans[i-1],(i==n?'
    ':' '));
            }
        }
        return 0;
    }
    
  • 相关阅读:
    Python-time和datetime模块
    Python-hashlib模块
    Python-利用flask模块创建web接口
    Python-操作Excel
    2
    1
    8
    7
    HDFS元数据管理实战篇
    使用HttpFS网关从防火墙后面访问HDFS
  • 原文地址:https://www.cnblogs.com/Aya-Uchida/p/11299048.html
Copyright © 2020-2023  润新知