弄了半天,把前面的mcs用链表做到了O(m) 然后后面乱yy了一个O(m)的染色,居然对了,然后发现貌似其实就是这样做的。。。但是和n^2的效率差不多。。似乎是因为读入数据比较大所以慢了。。 var cl,pr,next,c,ff,cf,dc,f,gg:array[0..10005] of longint; a,na,da:array[0..2000001] of longint; x,y,i,j,n,m,t1,tail,k,ans:longint; p:array[0..10005] of boolean; procedure newd(x,y:longint); begin inc(t1); if a[x]<>0 then na[t1]:=a[x]; a[x]:=t1;da[t1]:=y; inc(t1); if a[y]<>0 then na[t1]:=a[y]; a[y]:=t1;da[t1]:=x; end; procedure did(x:longint); var i,j,k,l:longint; begin i:=a[x]; while i<>0 do begin if p[da[i]] then begin j:=c[da[i]]; next[pr[j]]:=next[j];pr[next[j]]:=pr[j]; if ff[cf[j]]=j then begin if cf[next[j]]=cf[j] then ff[cf[j]]:=next[j] else ff[cf[j]]:=0;end else if gg[cf[j]]=j then gg[cf[j]]:=pr[j]; if ff[cf[j]]<>0 then l:=gg[cf[j]] else l:=pr[j]; inc(cf[j]); if (ff[cf[j]]<>0) then begin k:=pr[ff[cf[j]]];next[j] :=ff[cf[j]];pr[j]:=k; next[k]:=j;pr[ff[cf[j]]]:=j;ff[cf[j]]:=j;end else begin pr[next[l]]:=j;next[j]:=next[l]; next[l]:=j;pr[j]:=l;ff[cf[j]]:=j;gg[cf[j]]:=j; end; end; i:=na[i];end; end; begin assign(input,'kingdom.in');reset(input); assign(output,'kingdom.out');rewrite(output); readln(n,m); for i:=1 to m do begin readln(x,y); newd(x,y);end; fillchar(p,sizeof(p),true); fillchar(ff,sizeof(ff),0); f[1]:=n;p[n]:=false;ff[0]:=1;gg[0]:=n-1; next[0]:=1; for i:=1 to n-1 do begin c[i]:=i;dc[i]:=i;pr[i]:=i-1;cf[i]:=0;next[i]:=i+1;end; tail:=n;pr[tail]:=n-1; did(n); for i:=2 to n do begin j:=pr[tail]; k:=pr[j]; next[k]:=tail;pr[tail]:=k; if ff[cf[j]]=j then ff[cf[j]]:=0 else if gg[cf[j]]=j then gg[cf[j]]:=pr[j]; f[i]:=dc[j];p[dc[j]]:=false; did(dc[j]);end; ans:=1; cl[f[1]]:=1; for i:=1 to n do begin j:=a[f[i]]; while j<>0 do begin k:=da[j]; inc(cl[k]);j:=na[j];end; if ans<cl[f[i]] then ans:=cl[f[i]];end; writeln(ans+1); close(input);close(output); end.