POJ 1659 Frogs’ Neighborhood

来源:互联网 发布:淘宝服装图片拍摄 编辑:程序博客网 时间:2024/06/07 00:52

POJ 1659 Frogs’ Neighborhood

图论,连通分量,想法题

传送门:HustOJ

传送门:POJ


题意

给出一个非负整数的序列,问这个序列是否是可图序列,而是否可图根据
Havel-Hakimi定理的方法来构图。


思路

Havel-Hakimi定理:
1,一个非负整数组成的有限序列如果是某个无向图的序列,则称该序列是可图的。

2,判定过程:
(1)对当前数列排序,使其呈非递增序列
(2)从第二个数开始对其后d[1]个数字减1,d[1]代表排序后第1个数的值
(3)然后删除第一个之后对剩下的数继续排序
(3)一直循环直到当前序列出现负数(即不是可图的情况)或者当前序列全为0 (可图)时退出。

3,举例:
序列S:7,7,4,3,3,3,2,1
删除序列S的首项 7 ,对其后的7项每项减1,
得到:6,3,2,2,2,1,0,
继续删除序列的首项6,
对其后的6项每项减1,
得到:2,1,1,1,0,-1,
到这一步出现了负数,因此该序列是不可图的

再举例:
序列:4 3 1 5 4 2 1
排序之后:5 4 4 3 2 1 1
删除5对后面5个数减1操作
3 3 2 1 0 1
排序
3 3 2 1 1 0
删除3对后面3个数减1操作
2 1 0 1 0
排序
2 1 1 0 0
删除2 对后面2个数减1操作
0 0 0 0
全为0,可图


代码

#include <cstdio>#include <cstdlib>#include <iostream>#include <algorithm>#include <string>#include <cstring>#include <vector>#include <cmath>#include <queue>#include <stack>#include <map>#define _ ios_base::sync_with_stdio(0),cin.tie(0)#define M(a,b) memset(a,b,sizeof(a))using namespace std;const int MAXN=15;const int oo=0x3f3f3f3f;typedef __int64 LL;const LL loo=4223372036854775807ll;typedef long double LB;const LL mod=1e9+7;typedef long long LL;struct TT{    int i;    int de;    TT(){}    TT(int _i, int _de) { i=_i;de=_de; }    bool operator < (const TT& tt) const    {        return de>tt.de;    }};TT de[MAXN];int G[MAXN][MAXN];int main(){    _;    int T;cin>>T;    while(T--)    {        M(G, 0);        int n;cin>>n;        bool flag=0;        for(int i=1;i<=n;i++) { cin>>de[i].de; de[i].i=i; }        for(int i=1;i<=n;i++)        {            sort(de+i, de+1+n);            int cnt=de[i].de;            for(int j=i+1;(--cnt)>=0;j++)            {                de[j].de--;                if(de[j].de<0) { flag=1;goto re; }                G[de[i].i][de[j].i]=1;                G[de[j].i][de[i].i]=1;            }            de[i].de=0;        }        for(int i=1;i<=n;i++)        {            if(de[i].de>0)            {                flag=1;                goto re;            }        }    re:        if(flag==1) cout<<"NO"<<endl;        else        {            cout<<"YES"<<endl;            for(int i=1;i<=n;i++)            {                for(int j=1;j<=n;j++)                {                    cout<<G[i][j]<<(j==n ? '\n' : ' ');                }            }        }        cout<<endl;    }    return 0;}
0 0