ArcTan

dfs
随笔 - 16, 文章 - 117, 评论 - 6, 引用 - 0
数据加载中……

Havel_Hakimi定理(可图性判定)-poj1659

度序列(Degree Sequence):把图G所有顶点的度数排成一个序列s,则称s为图G的度序列。如
             s:2,5,4,3,3,1 或者 s1:1,2,3,4,5 或者 s2:5,4,3,2,1

可图的(Graphic):一个非负整数组成的有限序列如果是某个无向图的度序列,则称该序列是Graphic!

Havel-Hakimi定理(贪心):
                        由非负数组成的非增序列s:d1,d2,d3....dn(n>=2,d1>=1)是Graphic,当且仅当序列
                                               s1:d2-1,d3-1,...,d(d1+1)-1,d(d1+2),....,dn 是Graphic!

应用:poj1659:
#include<stdio.h>
#include
<string.h>
#include
<math.h>
#include
<algorithm>
using namespace std;
struct vertex
{
    
int deg;
    
int index;
} ver[
12];

int adj[12][12];
int n;


int cmp(vertex v1,vertex v2)
{
    
return v1.deg>v2.deg;
}
int Havel_Hak()
{
    
int i,j,u,v,m;
    i
=1;
    
while (i<n)
    {
        sort(ver
+i,ver+n+1,cmp);
        m
=ver[i].deg;
        u
=ver[i].index;
        
if (i+m>n)
            
return 0;
        j
=i+1;
        
while (j<=i+m)
        {
            ver[j].deg
--;
            
if (ver[j].deg<0)
                
return 0;
            v
=ver[j].index;
            adj[u][v]
=adj[v][u]=1;
            j
++;
        }
        i
++;
    }
    
return 1;
}
int print(int flag)
{
    
int i,j;
    
if (!flag)
    {
        printf(
"NO\n");
        
return 0;
    }
    printf(
"YES\n");
    
for (i=1;i<=n;i++)
    {
        
for (j=1;j<n;j++)
            printf(
"%d ",adj[i][j]);
        printf(
"%d\n",adj[i][j]);
    }
    
return 0;
}
int main()
{
    
int t,i;
    scanf(
"%d",&t);
    
while (t--)
    {
        scanf(
"%d",&n);
        
for (i=1;i<=n;i++)
        {
            scanf(
"%d",&ver[i].deg);
            ver[i].index
=i;
        }
        memset(adj,
0,sizeof(adj));
        print(Havel_Hak());

        
if (t>0)
            printf(
"\n");
    }
    
return 0;
}

posted on 2012-07-07 17:45 wangs 阅读(527) 评论(0)  编辑 收藏 引用 所属分类: ACM-图论


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理