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 / 思维 数组循环移动