bzoj 2530: [Poi2011]Party

Description

Byteasar intends to throw up a party. Naturally, he would like it to be a success. Furthermore, Byteasar is quite certain that to make it so it suffices if all invited guests know each other. He is currently trying to come up with a list of his friends he would like to invite. Byteasar has friends, where is divisible by 3. Fortunately, most of Byteasar’s friends know one another. Furthermore, Byteasar recalls that he once attended a party where there were2/3 n of his friends, and where everyone knew everyone else. Unfortunately, Byteasar does not quite remember anything else from that party… In particular, he has no idea which of his friends attended it. Byteasar does not feel obliged to throw a huge party, but he would like to invite at least n/3of his friends. He has no idea how to choose them, so he asks you for help.
给定一张 N (保证 N 3 的倍数)个节点 M 条边的图,并且保证该图存在一个大小至少为 2n3 的团。
请输出该图的任意一个大小为 n3 的团。 一个团的定义为节点的一个子集,该子集中的点两两有直接连边。
输入: 第一行是两个整数 N,M 。 接下来有 M 行,每行两个整数 A,B,表示 A B 有连边。保证无重边。
输出: n3 个整数,表示你找到的团。 数据范围:
3N3000,2M[n(n1)/2]

Input

In the first line of the standard input two integers, n and M(3<=N<=3000,[3/2 n(2/3 n -1)]/2<=M<=[n(n-1)/2]), are given, separated by a single space. These denote the number of Byteasar’s friends and the number of pairs of his friends who know each other, respectively. Byteasar’s friends are numbered from 1 to . Each of the following lines holds two integers separated by a single space. The numbers in line no.i+1(for i=1,2,…,m) are Ai and Bi(1<=Ai

Output

In the first and only line of the standard output your program should print N/3numbers, separated by single spaces, in increasing order. These number should specify the numbers of Byteasar’s friends whom he should invite to the party. As there are multiple solutions, pick one arbitrarily.

Sample Input

6 10
2 5
1 4
1 5
2 4
1 3
4 5
4 6
3 5
3 4
3 6

Sample Output

2 4

HINT

Explanation of the example: Byteasar’s friends numbered 1, 3, 4, 5 know one another. However, any pair of Byteasar’s friends who know each other, like 2 and 4 for instance, constitutes a correct solution, i.e., such a pair needs not be part of aforementioned quadruple.

Source

鸣谢 Object022&suhang


solution

  • 先普及一下什么是团

    选择一个图中的若干点,若任意两个点之间均有一条边联通,则这些点组成的集合是一个团。

  • 知道了这个这道题就很简单了

  • 在一个团里的点肯定是两个点之间均有一条边联通

  • 所以不在团里的点肯定没有一条边让他们联通

  • 所以枚举每个点和哪个点之间没有边,然后打一个标记

  • 最后输出还有被标记的点就好了..

code

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
typedef long long ll;

template<typename T>
void input(T &x) {
    x=0; T a=1;
    register char c=getchar();
    for(;c<'0'||c>'9';c=getchar())
        if(c=='-') a=-1;
    for(;c>='0'&&c<='9';c=getchar())
        x=x*10+c-'0';
    x*=a;
    return;
}

#define MAXN 3010

bool G[MAXN][MAXN],vis[MAXN];

int main() {
    int n,m;
    input(n),input(m);
    for(int i=1;i<=m;i++) {
        int u,v;
        input(u),input(v);
        G[u][v]=G[v][u]=true;
    }
    for(int i=1;i<=n;i++)
        if(!vis[i]) {
            for(int j=i+1;j<=n;j++)
                if(!vis[j]&&!G[i][j]&&!G[j][i]) {
                    vis[i]=vis[j]=true;
                    break;
                }
        }
    int cnt=0;
    for(int i=1;i<=n;i++)
        if(!vis[i]) {
            printf("%d ",i);
            cnt++;
            if(cnt*3==n) return 0;
        }
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值