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