問題の意味
コードダイアグラム最小限の着色、そのを求めて
最小の着色:最小限の染色カラーポイント、そのような異なる色の隣接するドット
ストリング:二つのエッジ点は、隣接するリングに接続されていません
サイノグラム:図のように、任意の長さなしでリングとしてサイノグラム少なくとも一つのコードを有しているよりも、図3より大きい。
特に参照すると、このブログ
考え
最大の潜在的アルゴリズム
追加します
各点の初期化:この問題にアプローチである\(ラベル\)は、0であり、各非選択が持っていた選択\(ラベル\)その固定するための最大点を\(ラベル\)値そして、それが直接選択されていない点の側を介して接続されている\(ラベル\)値(+ \ 1)\、このプロセスは、リンクリストとして実施することができます
コード:
#include<bits/stdc++.h>
#define N 10005
#define M 1000005
#define Max(x,y) ((x)>(y)? (x) : (y))
using namespace std;
int n,m;
int label[N],nxt[N<<1],las[N<<1],best=0;
bool vis[N];
struct Edge
{
int next,to;
}edge[M<<1];int head[N],cnt=1;
void add_edge(int from,int to)
{
edge[++cnt].next=head[from];
edge[cnt].to=to;
head[from]=cnt;
}
template <class T>
void read(T &x)
{
char c;int sign=1;
while((c=getchar())>'9'||c<'0') if(c=='-') sign=-1; x=c-48;
while((c=getchar())>='0'&&c<='9') x=x*10+c-48; x*=sign;
}
void add(int i)
{
nxt[i]=nxt[N+label[i]];
las[i]=N+label[i];
nxt[las[i]]=i;
las[nxt[i]]=i;
}
void del(int i)
{
nxt[las[i]]=nxt[i];
las[nxt[i]]=las[i];
}
int main()
{
read(n);read(m);
for(int i=1;i<=n;++i) add(i);//全部加入0号链表
for(int i=1;i<=m;++i)
{
int x,y;
read(x);read(y);
add_edge(x,y);
add_edge(y,x);
}
for(int i=1;i<=n;++i)
{
while(!nxt[best+N]) best--;
int now=nxt[best+N];
del(now);
vis[now]=1;
for(int j=head[now];j;j=edge[j].next)
{
int v=edge[j].to;
if(!vis[v])
{
del(v);
label[v]++;
best=Max(best,label[v]);
add(v);
}
}
}
int maxx=-1;
for(int i=1;i<=n;++i) maxx=Max(maxx,label[i]);
cout<<maxx+1<<endl;
return 0;
}