如果不知道弦图,请学习陈丹琦的弦图与区间图 PPT
学习完了之后就发现这是一道裸题= =
先求出完美消除序列,再倒着进行贪心。
蒟蒻用的是MCS算法。
在这里蒟蒻提一个小小的问题,为什么一定要先求出完美消除序列再来进行贪心?
#include <cstring>
#include <cstdio>
#define MAXN 10005
#define MAXM 1000005
using namespace std;
int n, m, a, b, label[MAXN], color[MAXN], num[MAXN];
bool in[MAXN], flag[MAXN];
struct node
{
int v;
node *next;
}edge[MAXM<<1], *adj[MAXN], *pos=edge;
inline void adde(int a,int b)
{
pos->v=b, pos->next=adj[a];
adj[a]=pos;
++pos;
}
void init()
{
int maxp;
label[0]=-1;
for(int i=n;i>0;--i)
{
maxp=0;
for(int j=1;j<=n;++j)
if(!in[j]&&label[j]>label[maxp])
maxp=j;
num[i]=maxp, in[maxp]=1;
for(node *p=adj[maxp];p!=NULL;p=p->next)
++label[p->v];
}
}
int solve()
{
int ans=0;
for(int i=n;i>0;--i)
{
memset(flag,0,sizeof flag);
for(node *p=adj[num[i]];p!=NULL;p=p->next)
flag[color[p->v]]=1;
for(int j=1;j<=ans;++j)
if(!flag[j])
{
color[num[i]]=j;
break;
}
if(!color[num[i]])color[num[i]]=++ans;
}
return ans;
}
int main()
{
scanf("%d%d",&n,&m);
while(m--)
{
scanf("%d%d",&a,&b);
adde(a,b), adde(b,a);
}
init();
printf("%d\n",solve());
return 0;
}
/*
4 5
1 2
1 4
2 4
2 3
3 4
*/