这回没看黄学长的代码,看的是chty的

原题:

K国是一个热衷三角形的国度,连人的交往也只喜欢三角原则.他们认为三角关系:即AB相互认识,BC相互认识,CA
相互认识,是简洁高效的.为了巩固三角关系,K国禁止四边关系,五边关系等等的存在.所谓N边关系,是指N个人 A1A2
...An之间仅存在N对认识关系:(A1A2)(A2A3)...(AnA1),而没有其它认识关系.比如四边关系指ABCD四个人 AB,BC,C
D,DA相互认识,而AC,BD不认识.全民比赛时,为了防止做弊,规定任意一对相互认识的人不得在一队,国王相知道,
最少可以分多少支队。

1<=N<=10000,1<=M<=1000000

恩…建议先看一下cdq的《弦图与区间图》,你只要把内个东西看懂了这题就差不多了

首先这个图一定是弦图,题目中说的关系的性质就可以看成是弦图的定义

然后使用mcs求完美消除序列,这个可以在《弦图与区间图》中学习

然后根据消除序列从后往前染色即可

首先有一个非常严重的问题,团数并不是团的个数,而是最大团的节点的个数!!!

这个是NOIP吧里的证明:

首先团数<=色数 应该可以吧...
因为最大团的点必然每一个点的颜色不同...
接下来由于最大势算法求出的 那个 完美消除序列的每一个点都满足它与它后面的相连的点构成一个团,由于这个性质,考虑 节点 i 的时候 ,i后面与它相连的点都必然 是相互连接的, 也就是说 i 后面与它相连的点也是一个团。
考虑那个染色算法...我们染到第i个点的时候,由于上面的性质,与i相连的点必然相互染的是不同的颜色,所以我们考虑色数实际上就是考虑每一个点与它的相连的点构成的团的最大团数即可,所以 团数>=色数。
所以 团数=色数

勉强能理解吧……然后染色的时候从1开始枚举颜色,直到第i个颜色没有被周围的任何一个节点染色,这个节点的颜色就是i,然后维护最大的i,就是团数

这里有个小技巧,可以通过判断flag[color[e[j].y]]=i来判断i个颜色有没有被周围的任何一个节点染色,这样就不用memset了

代码:

 #include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
using namespace std;
int read(){int z=,mark=; char ch=getchar();
while(ch<''||ch>''){if(ch=='-')mark=-; ch=getchar();}
while(ch>=''&&ch<=''){z=(z<<)+(z<<)+ch-''; ch=getchar();}
return z*mark;
}
struct ddd{int next,y;}e[];int LINK[],ltop=;
inline void insert(int x,int y){e[++ltop].next=LINK[x];LINK[x]=ltop;e[ltop].y=y;}
int n,m;
int label[];
bool visited[];
int peo[];
int color[];
int flag[];
int ans=;
void mcs(){
for(int i=n;i;i--){
int now=;
for(int j=;j<=n;j++)//注意这个label最大的点并不是和i相邻的点,而是全局点
if(label[j]>=label[now] && !visited[j]) now=j;//这个循环一搞不就变成n^2的了???
visited[now]=true;
peo[i]=now;
for(int j=LINK[now];j;j=e[j].next)
label[e[j].y]++;
}
}
void get_color(){
for(int i=n;i;i--){
int now=peo[i];
for(int j=LINK[now];j;j=e[j].next) flag[color[e[j].y]]=i;//标记成i的话就不用memset了
int _color=;
while(flag[_color]==i) _color++;
color[now]=_color;
ans=max(ans,_color);
}
}
int main(){//freopen("ddd.in","r",stdin);
memset(visited,,sizeof(visited));
cin>>n>>m;
int _left,_right;
while(m --> ){
_left=read(),_right=read();
insert(_left,_right),insert(_right,_left);
}
mcs();
get_color();
cout<<ans<<endl;
return ;
}

最新文章

  1. Mono 3.8发布:性能进一步改进,可伸缩性提升
  2. 游戏编程系列[1]--游戏编程中RPC协议的使用[2]--Aop PostSharp篇
  3. [LintCode] Find Peak Element 求数组的峰值
  4. 通过Redux源码学习基础概念一:简单例子入门
  5. Spring学习系列(三) 通过Java代码装配Bean
  6. GamePinTu
  7. C# 多线程详解 Part.04(Lock、Monitor、生产与消费)
  8. 【Alpha版本】冲刺-Day8
  9. Python自动化之语法基础
  10. Object C学习笔记19-枚举
  11. js 正则表达式中的惰性匹配
  12. kuangbin_ShortPath O (LightOJ 1074)
  13. selenium python (一) 开发环境搭建
  14. pos机套现是怎么回事
  15. Spring MVC BeanNameUrlHandlerMapping example
  16. (转)INSTALLSHIELD 2010 预安装组件和软件
  17. SKShapeNode类
  18. R语言机器学习之caret包运用
  19. 使用PHPword中文乱码并且下载的方法
  20. IE11开发人员工具 js脚本debugger调试

热门文章

  1. java基础之 垃圾回收机制
  2. JAVA之关于super的用法
  3. [C/C++]C++标准中的名词
  4. ASP.NET 分页控件
  5. Python开发入门与实战1-开发环境
  6. mybatis 的 resulttype 和resultMap
  7. 修改Oracle数据库的字符集为UTF-8
  8. ACM -二分图题目小结
  9. copy和assign的使用和区别
  10. Google protobuf