弦图
最小染色数=最大团大小。
A
C
C
o
d
e
\mathcal AC \ Code
AC Code
#include<bits/stdc++.h>
#define maxn 10005
#define maxm 2000007
#define rep(i,j,k) for(int i=(j),LIM=(k);i<=LIM;i++)
#define per(i,j,k) for(int i=(j),LIM=(k);i>=LIM;i--)
#define pb push_back
using namespace std;
int n,m;
int info[maxn],Prev[maxm],to[maxm],cnt_e;
void Node(int u,int v){ Prev[++cnt_e]=info[u],info[u]=cnt_e,to[cnt_e]=v; }
int ans,ar[maxn],rk[maxn];
void MCS(){
vector<int>G[maxn];
static int v[maxn]={},mx;
rep(i,1,n) v[i]=0,G[0].pb(i);
mx = 0;
per(i,n,1){
for(;v[G[mx].back()]==-1;){
G[mx].pop_back();
while(G[mx].empty()) mx--;
}
rk[ar[i] = G[mx].back()] = i;
v[ar[i]] = -1;
for(int j=info[ar[i]];j;j=Prev[j])
if(v[to[j]] != -1)
G[++v[to[j]]].pb(to[j]),mx=max(mx,v[to[j]]);
}
per(i,n,1) if(info[ar[i]]){
int u=ar[i],sm=0;
for(int j=info[u];j;j=Prev[j])
if(rk[to[j]] >= rk[u])
sm++;
ans = max(ans , sm);
}
return;
}
int main(){
scanf("%d%d",&n,&m);
rep(i,1,m){
int u,v;
scanf("%d%d",&u,&v);
Node(u,v),Node(v,u);
}
MCS();
printf("%d\n",ans+1);
}