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

猜你喜欢

转载自www.cnblogs.com/Aya-Uchida/p/11299048.html
今日推荐