zoukankan      html  css  js  c++  java
  • [bzoj1006](HNOI2008)神奇的国度(弦图最小染色)【太难不会】

    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

    HINT

    一种方案(1,3)(2)(4)

     分析

        我的能力也仅限于把问题转化为最小染色数= =然后我就不会做啦╮(╯▽╰)╭

        其实这是个神奇的论文题……要用到弦图的单纯点和“完美消除序列”的概念,课件详见陈丹琦的冬令营2009讲稿《弦图与区间图》……

        呃……我实在太弱,看了课件也是不知所云= =先留成坑吧……

     1 /**************************************************************
     2     Problem: 1006
     3     User: AsmDef
     4     Language: C++
     5     Result: Accepted
     6     Time:1432 ms
     7     Memory:12424 kb
     8 ****************************************************************/
     9  
    10 /*====================Asm.Def========================*/
    11 #include <iostream>
    12 #include <cctype>
    13 #include <cstdio>
    14 #include <vector>
    15 using namespace std;
    16 inline void getd(int &x){
    17     char c = getchar();
    18     bool minus = 0;
    19     while(!isdigit(c) && c != '-')c = getchar();
    20     if(c == '-')minus = 1, c = getchar();
    21     x = c - '0';
    22     while(isdigit(c = getchar()))x = x * 10 + c - '0';
    23     if(minus)x = -x;
    24 }
    25 /*======================================================*/
    26 const int maxn = 10002;
    27 vector<int> adj[maxn];
    28 int N, color[maxn] = {0}, ans = 0, adjcnt[maxn] = {0};
    29 inline void init(){
    30     int a, b, M;
    31     getd(N), getd(M);
    32     while(M--){
    33         getd(a), getd(b);
    34         adj[a].push_back(b);
    35         adj[b].push_back(a);
    36     }
    37 }
    38 inline void work(){
    39     int i, j, lim, tmp = 1, Max = 0;
    40     bool ok_col[maxn];
    41     lim = (int)adj[1].size();
    42     color[1] = 1;
    43     for(i = 0;i < lim;++i)
    44         if(!color[adj[1][i]]) ++adjcnt[adj[1][i]];
    45     for(i = 1;i < N;++i){
    46         Max = 0;
    47         for(j = 1;j <= N;++j){
    48             ok_col[j] = 1;
    49             if(!color[j] && adjcnt[j] > Max)tmp = j, Max = adjcnt[j];
    50         }
    51         lim = (int)adj[tmp].size();
    52         for(j = 0;j < lim;++j)
    53             ok_col[color[adj[tmp][j]]] = 0;
    54         for(j = 1;j <= N;++j) if(ok_col[j])break;
    55         color[tmp] = j;
    56         if(j > ans)ans = j;
    57         lim = (int)adj[tmp].size();
    58         for(j = 0;j < lim;++j)
    59             if(!color[adj[tmp][j]]) ++adjcnt[adj[tmp][j]];
    60     }
    61     printf("%d ", ans);
    62 }
    63 int main(){
    64     init();
    65     work();
    66     return 0;
    67 }
    MCS算法

  • 相关阅读:
    Alpha冲刺总结
    测试随笔
    项目Alpha冲刺Day11
    项目Alpha冲刺Day12
    项目Alpha冲刺Day10
    项目Alpha冲刺Day9
    项目Alpha冲刺Day6
    beta冲刺1
    Beta准备博客
    基于微信小程序的实验室管理的postmortem
  • 原文地址:https://www.cnblogs.com/Asm-Definer/p/4367961.html
Copyright © 2011-2022 走看看