博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
bzoj1006: [HNOI2008]神奇的国度
阅读量:5240 次
发布时间:2019-06-14

本文共 1518 字,大约阅读时间需要 5 分钟。

弦图染色

对于一般图,有性质最小染色数>=最大团

我们先用最大势求出完美消除序列,再逆序贪心涂色

正确性:

容易发现这样的涂色数=最大团数

而当前涂色数>=最小染色数

所以弦图最小染色数=最大团数

顺便放个:弦图还有一个这样的性质,最大独立集=最小团覆盖数,而在普通的图中是前者<=后者的

#include
#include
#include
#include
#include
#include
using namespace std;struct node{ int x,y,next;}a[2100000],e[2100000];int len,last[11000],elen,elast[11000];void ins(int x,int y){ len++; a[len].x=x;a[len].y=y; a[len].next=last[x];last[x]=len;}void eins(int x,int y){ elen++; e[elen].x=x;e[elen].y=y; e[elen].next=elast[x];elast[x]=elen;}int n,lab[11000],vq[11000];bool b[11000];void relab(){ int p=0,x; for(int i=1;i<=n;i++)eins(0,i); for(int i=n;i>=1;i--) { x=-1; while(x==-1) { int pre; for(int k=elast[p];k;pre=k,k=e[k].next) { int y=e[k].y; if(b[y]==false)x=y; else { if(k==elast[p])elast[p]=e[k].next; else e[pre].next=e[k].next; } } p--; } p++; vq[i]=x;b[x]=true; for(int k=last[x];k;k=a[k].next) { int y=a[k].y; if(b[y]==false) { lab[y]++; eins(lab[y],y); p=max(p,lab[y]); } } }}int co,c[11000];int ti,tim[11000];void paint(){ co=ti=0; for(int i=n;i>=1;i--) { int x=vq[i]; ti++; for(int k=last[x];k;k=a[k].next)tim[c[a[k].y]]=ti; for(int j=1;;j++) if(tim[j]!=ti){c[x]=j;break;} co=max(co,c[x]); }}int main(){ int m,x,y; scanf("%d%d",&n,&m); len=0;memset(last,0,sizeof(last)); for(int i=1;i<=m;i++) { scanf("%d%d",&x,&y); ins(x,y),ins(y,x); } relab(); paint(); printf("%d\n",co); return 0;}

 

转载于:https://www.cnblogs.com/AKCqhzdy/p/10210778.html

你可能感兴趣的文章
Java中常见的集合类比较
查看>>
python - 内置函数
查看>>
HTML 表单 / HTML5 表单元素datalist
查看>>
List<>集合
查看>>
python 全栈开发,Day71(模型层-单表操作)
查看>>
javascript函数编程与currying
查看>>
淘宝首页上的一个设计
查看>>
回忆(四):通过反射获得私有构造实例化得到对象
查看>>
移动安全漏洞分析报告(转)
查看>>
android 7.x 单独编译framework失效问题
查看>>
游戏:切方块
查看>>
Java分布式:分布式事务
查看>>
Java基础教程:多线程杂谈——Volatile
查看>>
微服务实践:服务运维
查看>>
最小的K个数(python)
查看>>
创建一个项目并在GitHub上发出拉取请求
查看>>
省选专练之容斥【BZOJ4767】两双手
查看>>
01矩阵
查看>>
动态ip发布web+绑定域名
查看>>
点云的一些疑问
查看>>