[POI2011]IMP-Party

摘要

题意:一个 n 个点 m 条边的无向图 \(n\equiv 0(\bmod 3)\),保证存在一个大小为 \(\frac{2}{3}n\) 的团,要求输出一个大小为 \(\frac{1}{3}n\) 的团.\(n\leq 3000\).

这道题的特殊之处在于找团,而它保证有一个 \(\frac{2}{3}n\) 大小的团,却只让我们找一个 \(\frac{1}{3}n\) 的团. 这意味着我们在寻找的过程中可以舍弃一些点。

团中的点是两两相邻的,因此我们直接枚举判断不相邻的两个点并直接舍掉. 每个点最多被舍掉一次. 考虑这样做的正确性. 你找到的两个点一定不可能同时是 \(\frac{2}{3}n\) 团中的点,要么一个是团中的点一个不是,要么两个都不是其中的点. 因此这个操作最多进行 \(\frac{1}{3}n\) 次,每次取 2 个点,最后剩下的 \(\frac{1}{3}\) 个点一定是一个团。

#include<bits/stdc++.h>
using namespace std;
const int N=3e3+5;

int n,m,e[N][N];
bool v[N];

int main(){
    ios::sync_with_stdio(false);
	cin>>n>>m;
	for(int i=1;i<=m;i++){
		int u,v;
		cin>>u>>v;
		e[u][v]=e[v][u]=1;
	}
	for(int i=1;i<=n;i++){
        if(v[i])continue;
		for(int j=i+1;j<=n;j++)if(!v[j]&&!e[i][j]){
			v[j]=v[i]=1;break;
		}
	}
	int tot=0;
	for(int i=1;i<=n;i++){
        if(!v[i])cout<<i<<' ',++tot;
		if(tot*3==n)break;
	}
	return 0;
}
posted @ 2019-06-15 08:21  Sshwy  阅读(253)  评论(0编辑  收藏  举报