列表

详情


NC20068. [HNOI2008]神奇的国度

描述

K国是一个热衷三角形的国度,连人的交往也只喜欢三角原则.他们认为三角关系:即AB相互认识,BC相互认识,CA 相互认识,是简洁高效的.
为了巩固三角关系,K国禁止四边关系,五边关系等等的存在.所谓N边关系,是指N个人 A1A2 ...An之间仅存在N对认识关系:(A1A2)(A2A3)...(AnA1),而没有其它认识关系.比如四边关系指ABCD四个人 AB,BC,C D,DA相互认识,而AC,BD不认识.
全民比赛时,为了防止做弊,规定任意一对相互认识的人不得在一队,国王相知道, 最少可以分多少支队。

输入描述

第一行两个整数N,M。1 ≤ N ≤ 10000,1 ≤ M ≤ 1000000.
表示有N个人,M对认识关系. 接下来M行每行输入一对朋友

输出描述

输出一个整数,最少可以分多少队

示例1

输入:

4 5
1 2
1 4
2 4
2 3
3 4

输出:

3

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++11(clang++ 3.9) 解法, 执行用时: 365ms, 内存消耗: 11872K, 提交时间: 2019-04-14 16:02:43

#include<cstdio>
#include<iostream>
#include<vector>
#include<iterator>

using namespace std;

typedef int int_t;
const int_t maxn = 10010;

vector<int_t> G[maxn];
bool vis[maxn];
int_t xl[maxn],deg[maxn];
int_t ccol[maxn];

template<class T>T read(T &x){
    x=0;char ch=0;
    while(!isdigit(ch))ch=getchar();
    while(isdigit(ch)){x=x*10+ch-'0';ch=getchar();}
    return x;
}

int main(){
    int_t n = read(n),m = read(m);
    for(int_t i=1;i<=m;i++){
        int_t f = read(f),t = read(t);
        G[f].push_back(t);
        G[t].push_back(f);
    }
    for(int_t i=1;i<=n;i++){
        int_t p = 0;
        for(int_t j=1;j<=n;j++)
            if(!vis[j] && deg[j]>=deg[p])p = j;
        xl[i] = p;vis[p] = true;
        for(vector<int_t>::iterator it = G[p].begin();it != G[p].end();it ++)
            if(!vis[*it])++deg[*it];
    }    
    int_t ans = 0;
    for(int_t i=1;i<=n;i++)
        ans = max(ans,deg[i]+1);
    cout<<ans;
}

上一题