每次找到一条没有被完全覆盖的边,删掉两边的点。因为每次删掉的两个点至少有一个不在团中,最坏情况下也会留下 n <script type="math/tex" id="MathJax-Element-7">n</script>个在团中的点。
#include<cstdio>
#include<algorithm>
using namespace std;
int map[3010][3010],out[3010],n,m;
int main()
{
freopen("party.in","r",stdin);
freopen("party.out","w",stdout);
int u,v;
scanf("%d%d",&n,&m);
while (m--)
{
scanf("%d%d",&u,&v);
map[u][v]=map[v][u]=1;
}
for (int i=1;i<=n;i++)
if (!out[i])
for (int j=i+1;j<=n;j++)
if (!out[j]&&!map[i][j])
{
out[i]=out[j]=1;
break;
}
for (int i=1,j=0;j<n/3;i++)
if (!out[i])
{
printf("%d ",i);
j++;
}
}