码迷,mamicode.com
首页 > 其他好文 > 详细

[POI2011]IMP-Party

时间:2019-08-13 20:35:06      阅读:73      评论:0      收藏:0      [点我收藏+]

标签:read   mes   using   ||   pac   mat   ace   poi   ring   

洛咕

题意:给定n个点m条无向边,(\(3\le n\le 3\ 000\), \(\frac{\frac{2}{3}n(\frac{2}{3}n-1)}{2}\leq m\leq \frac{n(n-1)}{2}\)),保证存在一个大小为\(\frac{2}{3}n\)的团,要求输出一个大小为\(\frac{n}{3}\)的团.

分析:丢脸的是,一开始连"团"是什么都不知道,错当作"环"来理解的,然后写了个DFS只过了样例...."团"中的点两两之间都是连通的,利用这条性质,我们先直接利用\(w[i][j]\)邻接矩阵来存边,然后\(n^2\)扫描,如果有一对点\((i,j)\)它们之间不连通,那么两个点中至少有一个点不在\(\frac{2}{3}n\)的团内,我们直接把这两个点都标记.然后最多能够标记出\(\frac{n}{3}\)对点,并且能够把\(\frac{n}{3}\)个不在\(\frac{2}{3}n\)的团内的点全部标记出来,并且最多能够标记\(\frac{n}{3}\)个在\(\frac{2}{3}n\)的团内的点,所以扫描之后我们再\(O(n)\)遍历,如果点i没有标记就直接输出,输出\(\frac{n}{3}\)个点即可,这些点一定都在\(\frac{2}{3}n\)的团内.

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<queue>
#include<map>
#include<set>
#define ll long long
using namespace std;
inline int read(){
    int x=0,o=1;char ch=getchar();
    while(ch!='-'&&(ch<'0'||ch>'9'))ch=getchar();
    if(ch=='-')o=-1,ch=getchar();
    while(ch>='0'&&ch<='9')x=x*10+ch-'0',ch=getchar();
    return x*o;
}
const int N=3005;
int bj[N],w[N][N];
int main(){
    int n=read(),m=read();
    for(int i=1;i<=m;++i){
        int a=read(),b=read();
        w[a][b]=w[b][a]=1;
    }
    for(int i=1;i<=n;++i){
        if(bj[i])continue;
        for(int j=1;j<=n;++j){
            if(bj[j])continue;
            if(!w[i][j]&&i!=j){
                bj[i]=1;bj[j]=1;
                break;
            }
        }
    }
    int now=0;
    for(int i=1;i<=n;++i){
        if(!bj[i]){
            printf("%d ",i);
            ++now;
        }
        if(now==n/3)break;
    }
    printf("\n");
    return 0;
}

[POI2011]IMP-Party

标签:read   mes   using   ||   pac   mat   ace   poi   ring   

原文地址:https://www.cnblogs.com/PPXppx/p/11348131.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!