BZOJ1006 HNOI2008 神奇的國度

1006: [HNOI2008]神奇的國度

Time Limit: 20 Sec  Memory Limit: 162 MB
Submit: 2463  Solved: 1110
[Submit][Status][Discuss]

Description

K國是一個熱衷三角形的國度,連人的交往也只喜歡三角原則.他們認爲三角關係:即AB相互認識,BC相互認識,CA相互認識,是簡潔高效的.爲了鞏固三角關係,K國禁止四邊關係,五邊關係等等的存在.所謂N邊關係,是指N個人 A1A2...An之間僅存在N對認識關係:(A1A2)(A2A3)...(AnA1),而沒有其它認識關係.比如四邊關係指ABCD四個人 AB,BC,CD,DA相互認識,而AC,BD不認識.全民比賽時,爲了防止做弊,規定任意一對相互認識的人不得在一隊,國王相知道,最少可以分多少支隊。

Input

第一行兩個整數N,M。1<=N<=10000,1<=M<=1000000.表示有N個人,M對認識關係. 接下來M行每行輸入一對朋友

Output

輸出一個整數,最少可以分多少隊

Sample Input

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

Sample Output

3


這種松蘑幼兒園就做過的題也沒啥好講的,就是好久沒更新blog了來水一水,題解詳見CDQ《弦圖與區間圖》
代碼如下:
/**************************************************************
    Problem: 1006
    User: duyixian
    Language: C++
    Result: Accepted
    Time:1064 ms
    Memory:29424 kb
****************************************************************/
 
/* 
* @Author: duyixian
* @Date:   2015-09-08 16:02:39
* @Last Modified by:   duyixian
* @Last Modified time: 2015-09-08 16:46:27
*/
 
#include "cstdio"
#include "cstdlib"
#include "iostream"
#include "algorithm"
#include "cstring"
#include "queue"
 
using namespace std;
 
#define MAX_SIZE 10005
#define INF 0x3F3F3F3F
#define Eps
#define Mod
 
inline int Get_Int()
{
    int Num = 0, Flag = 1;
    char ch;
    do
    {
        ch = getchar();
        if(ch == '-')
            Flag *= -1;
    }
    while(ch < '0' || ch > '9');
    do
    {
        Num = Num * 10 + ch - '0';
        ch = getchar();
    }
    while(ch >= '0' && ch <= '9');
    return Num *Flag;
}
 
struct Edge
{
    int To, Next;
}Edges[2000005];
 
int N, M, Total;
int Front[MAX_SIZE], Sequence[MAX_SIZE], Label[MAX_SIZE], Order[MAX_SIZE], Mark[MAX_SIZE], Color[MAX_SIZE];
 
priority_queue< pair<int, int> > Heap;
 
inline void Add_Edge(int From, int To)
{
    Edges[++Total].To = To;
    Edges[Total].Next = Front[From];
    Front[From] = Total;
}
 
inline void Add_Edges(int From, int To)
{
    Add_Edge(From, To);
    Add_Edge(To, From);
}
 
inline void Find()
{
    for(int i = 1; i <= N; ++i)
        Heap.push(make_pair(0, i));
    for(int j = N; j >= 1; )
    {
        int Now = Heap.top().second;
        Heap.pop();
        if(Order[Now])
            continue;
        Sequence[j] = Now;
        Order[Now] = j--;
        for(int i = Front[Now]; i; i = Edges[i].Next)
        {
            if(Order[Edges[i].To])
                continue;
            ++Label[Edges[i].To];
            Heap.push(make_pair(Label[Edges[i].To], Edges[i].To));
        }
    }
}
 
inline void Coloring(int Now)
{
    for(int i = Front[Now]; i; i = Edges[i].Next)
    {
        if(!Color[Edges[i].To])
            continue;
        Mark[Color[Edges[i].To]] = Now;
    }
    for(int i = 1; i <= N; ++i)
        if(Mark[i] != Now)
        {
            Color[Now] = i;
            break;
        }
}
 
int main()
{
    cin >> N >> M;
    for(int i = 1; i <= M; ++i)
        Add_Edges(Get_Int(), Get_Int());
    Find();
    for(int i = N; i >= 1; --i)
        Coloring(Sequence[i]);
    int Ans = 0;
    for(int i = 1; i <= N; ++i)
        Ans = max(Ans, Color[i]);
    cout << Ans << endl;
    return 0;
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章