题目大意:给定一个图,其中至少有一个大小为2/3的团,让你输出一个大小为1/3的团
每次找到两个之间没有边的点,他们之中至少有一个不在大团中,把这些删干净了至少还剩下N/3个的点,输出即可
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define N 3010
using namespace std;
int a[N][N];
bool vis[N];
int main()
{
int n,m;
scanf("%d%d",&n,&m);
int i,j,x,y;
for(i=1;i<=m;i++)
{
scanf("%d%d",&x,&y);
a[x][y]=true;
a[y][x]=true;
}
for(i=1;i<=n;i++)
if(!vis[i])
{
for(j=1;j<=n;j++)
if(j!=i&&!vis[j]&&!a[i][j])
{
vis[i]=true;
vis[j]=true;
break;
}
}
int cnt=0;
for(i=1;i<=n;i++)
if(!vis[i])
{
cnt++;
printf("%d ",i);
if(cnt==n/3) break;
}
}

本文介绍了一种从给定图中找出至少为节点总数1/3大小的团的算法。该算法通过不断移除相互间不存在边连接的点来缩小搜索范围,最终输出至少包含N/3个点的团。
2828

被折叠的 条评论
为什么被折叠?



