洛谷P3196 [HNOI2008]神奇的国度——题解

题目传送门
题目大意:
给定一个全部由三角形构成的图,给每个点染色,每个点和相邻点的颜色不能相同,问最少要使用多少种颜色。


思考过程&具体做法:
请参考弦图与区间图——cdq


代码:

#include <bits/stdc++.h>
using namespace std;

const int maxn=1e4+100,maxm=1e6+100;
struct stu
{
    int to,next;    
}road[2*maxm]; int first[maxn],cnt=0;
int label[maxn],book[maxn],col[maxn];
int n,m;
queue <int> q;

void addedge(int x,int y)
{
    road[++cnt].to=y;
    road[cnt].next=first[x];
    first[x]=cnt;   
}

void mcs()
{
    for(int i=1;i<=n;i++) label[i]=0;
    for(int i=n;i>=1;i--)
    {
        int maxx=-1,mark;
        for(int j=1;j<=n;j++) if(label[j]>=maxx&&!book[j]) { maxx=label[j];mark=j; }
        q.push(mark);
        book[mark]=1;
        for(int i=first[mark];i;i=road[i].next)
        {
            int to=road[i].to;
            if(!book[to]) label[to]++;  
        }
    }
}

int main()
{
    scanf("%d%d",&n,&m);
    for(int i=1;i<=m;i++)
    {
        int x,y;
        scanf("%d%d",&x,&y);
        addedge(x,y);addedge(y,x);  
    }
    mcs();
    int cnt=0;
    while(!q.empty())
    {
        int now=q.front();q.pop();
        for(int i=1;i<=cnt;i++) book[i]=0;
        for(int i=first[now];i;i=road[i].next)
        {
            int to=road[i].to;
            book[col[to]]=1;
        }
        bool flag=0;
        for(int i=1;i<=cnt;i++) if(!book[i]) { flag=1;col[now]=i;break; }
        if(!flag) { cnt++;col[now]=cnt; }
    }
    printf("%d\n",cnt);
    return 0;   
}

猜你喜欢

转载自blog.csdn.net/qq_39662197/article/details/80065349
今日推荐