bzoj2530 [POI2011]Party

bzoj2530 [POI2011]Party

给定一张 \(n\) (保证 \(n\)\(3\) 的倍数)个节点 \(m\) 条边的图,并且保证该图存在一个大小至少为 \(\frac{2}{3}n\) 的团。请输出该图的任意一个大小为 \(\frac{1}{3}n\)的团。

\(n\leq3000,\ m\leq n^2\)

贪心


神仙题一道……

结论:把所有不相邻的节点判掉,输出剩下的节点

若两点都不在团中,显然直接判掉;若其中一点在团中,判掉会失去一个答案节点。由于有至少 \(\frac{2}{3}n\) 个点两两相邻,因此最多只会执行 \(\frac{1}{3}n\) 次判点操作,于是就至少会留下 \(\frac{1}{3}n\) 个点,输出即可

时间复杂度 \(O(n^2)\)

代码

#include <bits/stdc++.h>
using namespace std;

const int maxn = 3010;
int n, m, flg[maxn], a[maxn][maxn];

int main() {
  scanf("%d %d", &n, &m);
  for (int i = 1; i <= m; i++) {
    int u, v;
    scanf("%d %d", &u, &v);
    a[u][v] = a[v][u] = 1;
  }
  for (int i = 1; i <= n; i++) {
    for (int j = i + 1; j <= n && !flg[i]; j++) {
      if (!a[i][j] && !flg[j]) {
        flg[i] = flg[j] = 1;
      }
    }
  }
  int cnt = 0;
  for (int i = 1; i <= n; i++) {
    if (!flg[i]) {
      if (++cnt > n / 3) break;
      printf("%d ", i);
    }
  }
  return 0;
}
posted @ 2019-05-17 21:24  cnJuanzhang  阅读(143)  评论(0编辑  收藏  举报