题目传送门
题目大意:
给定一个全部由三角形构成的图,给每个点染色,每个点和相邻点的颜色不能相同,问最少要使用多少种颜色。
思考过程&具体做法:
请参考弦图与区间图——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;
}