【Description】
K国是一个热衷三角形的国度,连人的交往也只喜欢三角原则.他们认为三角关系:即AB相互认识,BC相互认识,CA相互认识,是简洁高效的.为了巩固三角关系,K国禁止四边关系,五边关系等等的存在.所谓N边关系,是指N个人 A1A2…An之间仅存在N对认识关系:(A1A2)(A2A3)…(AnA1),而没有其它认识关系.比如四边关系指ABCD四个人 AB,BC,CD,DA相互认识,而AC,BD不认识.全民比赛时,为了防止做弊,规定任意一对相互认识的人不得在一队,国王相知道,最少可以分多少支队。
【Input】
第一行两个整数N,M。1<=N<=10000,1<=M<=1000000.表示有N个人,M对认识关系. 接下来M行每行输入一对朋友
【Output】
输出一个整数,最少可以分多少队
【Sample Input】
4 5
1 2
1 4
2 4
2 3
3 4
【Sample Output】
3
【Hint】
一种方案(1,3)(2)(4)
【Solution】
见CDQ论文《弦图与区间图》。时限长,就打了个速度慢的方法。
代码如下:
/**************************************************************
Problem: 1006
User: llgyc
Language: Pascal
Result: Accepted
Time:2204 ms
Memory:16064 kb
****************************************************************/
const maxn = 10005;
type etype = record
go,next:longint;
end;
var n,m,cnt,ans:longint;
e:array[0..200*maxn] of etype;
head,degree,queue,color,hash:array[0..maxn] of longint;
visited:array[0..maxn] of boolean;
procedure insert(u,v:longint); begin inc(cnt); e[cnt].go:=v; e[cnt].next:=head[u]; head[u]:=cnt; end;
procedure init();
var i,u,v:longint;
begin
readln(n,m); cnt:=0;
for i:=1 to m do begin
readln(u,v); insert(u,v); insert(v,u);
end;
end;
procedure mcs();
var i,j,tmp:longint;
begin
for i:=n downto 1 do begin
tmp:=0; for j:=1 to n do if (not visited[j]) and (degree[j]>=degree[tmp]) then tmp:=j;
visited[tmp]:=true; queue[i]:=tmp;
j:=head[tmp]; while (j<>0) do begin inc(degree[e[j].go]); j:=e[j].next; end;
end;
end;
procedure main();
var i,j,tmp:longint;
begin
for i:=n downto 1 do begin
tmp:=queue[i];
j:=head[tmp]; while (j<>0) do begin hash[color[e[j].go]]:=i; j:=e[j].next; end;
j:=1; while true do begin if hash[j]<>i then break; inc(j); end;
color[tmp]:=j; if j>ans then ans:=j;
end;
end;
begin
init();
mcs();
main();
writeln(ans);
end.