• [HNOI2008]神奇的国度


    弦图:当图中任意长度大于3的环都至少有一个弦时, 一个无向图称为弦图

    最大团数=最小色数
    最大独立集=最小团覆盖

    Description

      K国是一个热衷三角形的国度,连人的交往也只喜欢三角原则.他们认为三角关系:即AB相互认识,BC相互认识,CA
    相互认识,是简洁高效的.为了巩固三角关系,K国禁止四边关系,五边关系等等的存在.所谓N边关系,是指N个人 A1A2
    ...An之间仅存在N对认识关系:(A1A2)(A2A3)...(AnA1),而没有其它认识关系.比如四边关系指ABCD四个人 AB,BC,C
    D,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)

    网上一搜才找到是最大势算法(完美消除序列,弦图问题),具体的核心思想参考一个贴吧,但具体的还不是很懂。

    #include <iostream>
    #include <algorithm>
    #include <cstring>
    #include <cstdio>
    #include <vector>
    #include <queue>
    #include <stack>
    #include <cstdlib>
    #include <iomanip>
    #include <cmath>
    #include <cassert>
    #include <ctime>
    #include <cstdlib>
    #include <map>
    #include <set>
    using namespace std;
    #pragma comment(linker, "/stck:1024000000,1024000000")
    #define lowbit(x) (x&(-x))
    #define max(x,y) (x>=y?x:y)
    #define min(x,y) (x<=y?x:y)
    #define MAX 100000000000000000
    #define MOD 1000
    #define pi acos(-1.0)
    #define ei exp(1)
    #define PI 3.1415926535897932384626433832
    #define ios() ios::sync_with_stdio(true)
    #define INF 1044266558
    #define mem(a) (memset(a,0,sizeof(a)))
    typedef long long ll;
    vector<int>v[10006];
    bool vis[10006];
    int g[10006],n,m,d[10006],hash[10006],col[10006],x,y,cnt=0;
    int main()
    {
        scanf("%d%d",&n,&m);
        for(int i=0;i<m;i++)
        {
            scanf("%d%d",&x,&y);
            v[x].push_back(y);
            v[y].push_back(x);
        }
        memset(vis,0,sizeof(vis));
        d[0]=-1;
        for(int i=n;i;i--)
        {
            x=0;
            for(int j=1;j<=n;j++)
                if(!vis[j] && d[j]>d[x]) x=j;
            vis[x]=1;g[i]=x;
            for(int j=0;j<v[x].size();j++)
                d[v[x][j]]++;
        }
        for(int i=n;i;i--)
        {
            for(int j=0;j<v[g[i]].size();j++)
                hash[col[v[g[i]][j]]]=i;
            int j=1;
            while(hash[j]==i) j++;//最大团
            col[g[i]]=j;
            cnt=max(cnt,j);
        }
        printf("%d
    ",cnt);
        return 0;
    }
  • 相关阅读:
    hdu acm 2844 Coins 解题报告
    hdu 1963 Investment 解题报告
    codeforces 454B. Little Pony and Sort by Shift 解题报告
    广大暑假训练1 E题 Paid Roads(poj 3411) 解题报告
    hdu acm 2191 悼念512汶川大地震遇难同胞——珍惜现在,感恩生活
    hdu acm 1114 Piggy-Bank 解题报告
    poj 2531 Network Saboteur 解题报告
    数据库范式
    ngnix 配置CI框架 与 CI的简单使用
    Vundle的安装
  • 原文地址:https://www.cnblogs.com/shinianhuanniyijuhaojiubujian/p/8270393.html
Copyright © 2020-2023  润新知