POJ1659

Frogs‘ Neighborhood

Time Limit: 5000MS   Memory Limit: 10000K
Total Submissions: 8729   Accepted: 3676   Special Judge

Description

未名湖附近共有N个大小湖泊L1L2, ..., Ln(其中包括未名湖),每个湖泊Li里住着一只青蛙Fi(1 ≤ i ≤ N)。如果湖泊LiLj之间有水路相连,则青蛙FiFj互称为邻居。现在已知每只青蛙的邻居数目x1x2, ..., xn,请你给出每两个湖泊之间的相连关系。

Input

第一行是测试数据的组数T(0 ≤ T ≤ 20)。每组数据包括两行,第一行是整数N(2 < N < 10),第二行是N个整数,x1x2,..., xn(0 ≤ xi ≤ N)。

Output

对输入的每组测试数据,如果不存在可能的相连关系,输出"NO"。否则输出"YES",并用N×N的矩阵表示湖泊间的相邻关系,即如果湖泊i与湖泊j之间有水路相连,则第i行的第j个数字为1,否则为0。每两个数字之间输出一个空格。如果存在多种可能,只需给出一种符合条件的情形。相邻两组测试数据之间输出一个空行。

Sample Input

3
7
4 3 1 5 4 2 1
6
4 3 1 4 2 0
6
2 3 1 1 2 1

Sample Output

YES
0 1 0 1 1 0 1
1 0 0 1 1 0 0
0 0 0 1 0 0 0
1 1 1 0 1 1 0
1 1 0 1 0 1 0
0 0 0 1 1 0 0
1 0 0 0 0 0 0 

NO

YES
0 1 0 0 1 0
1 0 0 1 1 0
0 0 0 0 0 1
0 1 0 0 0 0
1 1 0 0 0 0
0 0 1 0 0 0 

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



分析:  给定一个非负整数序列,问是不是一个可图的序列,也就是说能不能根据这个序列构造一个图。   利用Havel-Hakimi定理。  (1)某次对剩下的序列进行非递增排序后,最大的度数degree超过了剩下的顶点数  (2)对最大度数后面的degree个数依次减1,出现了负数。  出现以上2种情况之一,则判定该序列不可图。



#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
#define N 15
struct vertex
{
    int degree;
    int index;
}V[N];
bool cmp(vertex x,vertex y)
{
    return x.degree>y.degree;
}
int main()
{
     int i,j,t,k,T,n,flag;
     int Edge[15][15];
     cin>>T;
     while(T--)
     {
         cin>>n;
         for(i=0;i<n;i++)
         {
             cin>>V[i].degree;
             V[i].index=i;
         }
         memset(Edge,0,sizeof(Edge));
         flag=1;
         for(k=0;k<n&&flag;k++)
         {
             sort(V+k,V+n,cmp);
             i=V[k].index;
             if(V[k].degree>n-k-1) flag=0;
             for(t=1;t<=V[k].degree&&flag;t++)
             {
                 j=V[k+t].index;
                 V[k+t].degree-=1;
                 if(V[k+t].degree<0) flag=0;
                 Edge[i][j]=Edge[j][i]=1;
             }
         }
         if(flag)
         {
             cout<<"YES"<<endl;
             for(i=0;i<n;i++)
             {
                 for(j=0;j<n-1;j++)
                    cout<<Edge[i][j]<<" ";
                 cout<<Edge[i][j]<<endl;
             }
             cout<<endl;
         }
         else cout<<"NO"<<endl<<endl;
     }
    return 0;
}

  

				
时间: 2024-10-16 14:03:20

POJ1659的相关文章

POJ1659 Frogs&#39; Neighborhood(Havel定理)

给一个无向图的度序列判定是否可图化,并求方案: 可图化的判定: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个点之间连边,然后这个点就可以不

poj1659 Frogs&#39; Neighborhood

给n个点,以及每个点的度,求一个可以满足的图. 额正解那个算法没有细看,感觉差不多的. 简单想想,分析一下样例就可以判断出无解的条件, 将点按度数从大到小排序,从大的开始处理,依次与后面点相连, 如果连到后面点的度数已经是0了,或者到最后一个点了这个点还没有连完则无解. #include<cstdio> #include<cstring> #include<vector> #include<queue> #include<iostream> #i

POJ-1659 Frogs&#39; Neighborhood---Havel-Hakimi定理

题目链接: https://vjudge.net/problem/POJ-1659 题目大意: 给定度数列,判断是否可以建图 思路: Havel-Hakimi定理 1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<algorithm> 5 #include<cmath> 6 #include<queue> 7 #include<stack

Havel-Hakimi定理 POJ1659

对于图的所有顶点,计算出每个顶点的度,度序列.给定一个序列判断序列是否可图. #include<cstdio> #include<algorithm> #include<cstring> using namespace std; int map[15][15]; struct vertext { int d; int num; }x[15]; bool cmp(vertext a,vertext b) { return b.d<a.d; } int main()

Havel定理 poj1659

http://blog.csdn.net/xcszbdnl/article/details/14174669 代码风格这里的 Frogs' Neighborhood Time Limit: 5000MS   Memory Limit: 10000K Total Submissions: 9953   Accepted: 4161   Special Judge Description 未名湖附近共有N个大小湖泊L1, L2, ..., Ln(其中包括未名湖),每个湖泊Li里住着一只青蛙Fi(1

Havel-Hakimi定理

s是指所有点的度数:由非负整数组成的非增序列s:d1,d2,d3.....,dn(n>=2,d1>=1)是可图的(即能构成图)当且仅当s1:d2-1,d3-1,...dn;是可图的:例如:判断序列s:7,7,4,3,3,3,2,1是否可图.删除序列开头的7,对其后面的7项都减1,得6,3,2,2,1,0:继续删除6,对其后6项减一,最后一位出现了负数,所以这个序列是不可图的:例如:判断序列s:5,4,3,3,2,2,2,1,1,1是否可图.删除序列开头的5,对其后面的5项都减1,得3,2,2,

Havel-Hakimi定理(握手定理)

由非负整数组成的非增序列s(度序列):d1,d2,…,dn(n>=2,d1>=1)是可图的,当且仅当序列: s1:d2 – 1,d3 – 1,…,dd1+1 – 1,dd1+2,…,dn 是可图的.序列s1中有n-1个非负整数,s序列中d1后的前d1个度数(即d2~dd1+1)减1后构成s1中的前d1个数. 说白了就是先把第一个点(度数为d1)连线到后面d1个点,保证第一个点度数满足,然后再以此类推考虑后面的点.如果后面所有顶点满足并且度数不多不少(最后不剩,过程中没有度数为负数),即可认为,

Havel-Hakimi定理---通过度数列判断是否可图化

0.可图:一个非负整数组成的序列如果是某个无向图的度序列,则该序列是可图的. 1.度序列:Sequence Degree,若把图G所有顶点的度数排成一个序列,责成该序列为图G的一个序列.该序列可以是非递增序的.可以是非递减序列.可以是任意无序的. 2.Havel-Hakimi定理:给定一个非负整数序列{d1,d2,...dn},若存在一个无向图使得图中各点的度与此序列一一对应,则称此序列可图化.进一步,若图为简单图,则称此序列可简单图化. 定理描述:由非负整数组成的有限非递增序列,S={d1,d