poj 1659 Frogs' Neighborhood

来源:互联网 发布:华为商城网站源码 编辑:程序博客网 时间:2024/06/07 17:02

题目链接:http://poj.org/problem?id=1659

解题思路:

Havel-Hakimi定理的套用,该定理详见http://sbp810050504.blog.51cto.com/2799422/883904

AC代码:

//我的图论学习之路 2#include<iostream>#include<cstdio>#include<cstdlib>#include<cstring>#include<cmath>#include<algorithm>using namespace std;const int maxn=15;int Edge[maxn][maxn];struct node{    int nub;//序号    int du;//度}v[maxn];bool cmp(node a,node b){    if(a.du>=b.du)        return true;    return false;}int T,N;int main(){    scanf("%d",&T);    while(T--)    {        memset(v,0,sizeof(v));        memset(Edge,0,sizeof(Edge));        scanf("%d",&N);        for(int i=0;i<N;i++)        {            scanf("%d",&v[i].du);            v[i].nub=i;        }        bool sign=true;        for(int i=0;i<N&&sign;i++)        {            sort(v+i,v+N,cmp);            int sum=v[i].du;            int nub1=v[i].nub;            if(sum>N-i-1)            {                sign=false;                break;            }            else            {                for(int k=i+1;k<=i+sum&&sign;k++)                {                    if(v[k].du<=0)                        {                            sign=false;                            break;                        }                    v[k].du--;                    Edge[nub1][v[k].nub]=Edge[v[k].nub][nub1]=1;                }            }        }        if(sign)        {            cout<<"YES"<<endl;            for(int i=0;i<N;i++)            {                for(int j=0;j<N;j++)                    {                        cout<<Edge[i][j];                        if(j!=N-1)                            cout<<" ";                        else                            cout<<endl;                    }            }        }        else            cout<<"NO"<<endl;        if(T)            cout<<endl;    }    return 0;}

0 0