先贴一个百度百科的注释
Havel定理编辑
本词条缺少概述、名片图,补充相关内容使词条更完整,还能快速升级,赶紧来编辑吧!
中文名
Havel定理
外文名
Canisters theorem
特 点
非负整数序列{dn}
实 质
无向图使得图中各点的度
给定一个非负整数序列{dn},若存在一个无向图使得图中各点的度与此序列一一对应,则称此序列可图化。进一步,若图为简单图,则称此序列可简单图化
可图化的判定:d1+d2+……dn=0(mod 2)。关于具体图的构造,我们可以简单地把奇数度的点配对,剩下的全部搞成自环。
可简单图化的判定(Havel定理):把序列排成不增序,即d1>=d2>=……>=dn,则d 可简单图化当且仅当d’={d2-1,d3-1,……d(d1+1)-1, d(d1+2),d(d1+3),……dn}可简单图化。简单的说,把d排序后,找出度最大的点(设度为d1),把它与度次大的d1个点之间连边,然后这 个点就可以不管了,一直继续这个过程,直到建出完整的图,或出现负度等明显不合理的情况。
定理的证明:略
然后贴一个实现的代码
#define REP(i, n) for(int i=0; i<n; i++)
pair<int, int> e1[maxm], e2[maxm];
struct Node
{
int d, id;
bool operator < (const Node& rhs) const
{
return d > rhs.d;
}
} p[][maxn]; bool solve(Node *p, pair<int, int> *e)
{
int cnt = ;
REP(i, n-)
{
sort(p+i, p+n);
if(p[i].d+i > n-) return false;
for(int j=i+; j <= p[i].d+i; j++)
{
if(--p[j].d < ) return false;
e[cnt++] = make_pair(p[i].id+, p[j].id+); // 加边
}
}
return p[n-].d == ;
}