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;
}