• [POI2011]IMP-Party


    洛咕

    题意:给定n个点m条无向边,((3le nle 3 000), (frac{frac{2}{3}n(frac{2}{3}n-1)}{2}leq mleq 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("
    ");
        return 0;
    }
    
    
  • 相关阅读:
    如何更好的学习编译原理?
    组合数据类型练习
    简化版c语言文法
    Python基础练习
    Linux 命令
    实验一:词法分析实验报告
    20160930 词法分析程序
    大数据概述
    WP7应用开发笔记(7) 配置和存储
    欧拉计划 第九题
  • 原文地址:https://www.cnblogs.com/PPXppx/p/11348131.html
Copyright © 2020-2023  润新知