题目链接
http://main.edu.pl/en/archive/oi/18/imp
题目大意
给你一个无向图,点数n<=3000,3|n,保证图中包含一个2n/3大小的团,要你从中找出一个大小大于等于n/3的团
思路
构造方法:
从图中删去所有互不相连的点对
证明:
由于图中存在一个2n/3大小的团,因此最多只会删除
n3
次点
而且删除的任何一个点对肯定不是在团里,这样的话,团外的最多删除
n3
个点,团内的最多删除
n3
个点,剩下至少
n3
个点,且剩下的点就是一个团
代码
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <algorithm>
#define MAXN 4000
using namespace std;
int mp[MAXN][MAXN];
int n,m;
bool deled[MAXN];
int main()
{
scanf("%d%d",&n,&m);
for(int i=1;i<=m;i++)
{
int a,b;
scanf("%d%d",&a,&b);
mp[a][b]=mp[b][a]=true;
}
for(int i=1;i<=n;i++)
if(!deled[i])
for(int j=1;j<=n;j++)
if(j!=i&&!deled[j]&&!mp[i][j])
{
deled[i]=deled[j]=true;
break;
}
int tot=0;
for(int i=1;i<=n;i++)
{
if(deled[i]) continue;
printf("%d ",i);
if(++tot==n/3) break;
}
printf("\n");
return 0;
}