标签:style class blog http ext 使用
题目链接:http://61.187.179.132/JudgeOnline/problem.php?id=1006
题意:给定一个弦图,求最小染色数。就是用最小数目的颜色进行染色使得任意两个相邻的节点颜色不同。
思路:(1)求出弦图的完美消除序列。 (2)贪心染色。从后向前用可以用的编号最小的颜色染色。在这里因为最小染色等于最大团,我直接求的最大团。为什么最小染色等于最大团呢?最大团w(G) 是包含点数最多的团,最小染色x(G)是相邻点不同色的最小颜色个数。那么w(G)<=x(G),因为最大团中起码需要w(G)种不同的颜色。对于 一个染色我们使用了T种,那么T>=x(W);另外,T=w(G),也就是我们只需要最大团中那么多就够了。所以w(G)=x(G)。
struct node
{
int v,next;
};
node edges[N*200];
int head[N],e;
int n,m,a[N],d[N],h[N],q[N],p[N];
void Add(int u,int v)
{
edges[e].v=v;
edges[e].next=head[u];
head[u]=e++;
}
void init()
{
int i,j,k,t,u;
FORL1(i,n)
{
t=-1;
FOR1(j,n) if(!h[j]&&d[j]>t) t=d[j],k=j;
h[k]=1; a[i]=k; p[k]=i;
for(j=head[k];j!=-1;j=edges[j].next)
{
u=edges[j].v;
d[u]++;
}
}
}
int cal()
{
int i,j,k,t,u,ans=0;
FORL1(i,n)
{
k=a[i]; q[k]=1;
for(j=head[k];j!=-1;j=edges[j].next)
{
u=edges[j].v;
if(p[u]>i) q[k]++;
}
ans=max(ans,q[k]);
}
return ans;
}
int main()
{
RD(n,m);
int i,u,v;
clr(head,-1);
FOR1(i,m) RD(u,v),Add(u,v),Add(v,u);
init();
PR(cal());
return 0;
}
BZOJ 1006 神奇的国度(弦图的染色数),布布扣,bubuko.com
标签:style class blog http ext 使用
原文地址:http://www.cnblogs.com/jianglangcaijin/p/3799693.html