Frogs' Neighborhood
Time Limit: 5000MS   Memory Limit: 10000K
Total Submissions: 9639   Accepted: 4051   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

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

Sample Output

  1. YES
  2. 0 1 0 1 1 0 1
  3. 1 0 0 1 1 0 0
  4. 0 0 0 1 0 0 0
  5. 1 1 1 0 1 1 0
  6. 1 1 0 1 0 1 0
  7. 0 0 0 1 1 0 0
  8. 1 0 0 0 0 0 0
  9.  
  10. NO
  11.  
  12. YES
  13. 0 1 0 0 1 0
  14. 1 0 0 1 1 0
  15. 0 0 0 0 0 1
  16. 0 1 0 0 0 0
  17. 1 1 0 0 0 0
  18. 0 0 1 0 0 0
  1. //本题的意思是给定一个非负的整数序列,稳是不是一个可图的序列
  2. //需要根据Havel-hakimi定理的方法来构图
  3. //不合理的情况:
  4. //1.对剩下的序列排序后,最大的度数(设为d1)超出了剩下的顶点数
  5. //2.对最大度数后面的d1个度数各减1后,出现了负数
  6. #include<queue>
  7. #include<stack>
  8. #include<math.h>
  9. #include<stdio.h>
  10. #include<numeric>//STL数值算法头文件
  11. #include<stdlib.h>
  12. #include<string.h>
  13. #include<iostream>
  14. #include<algorithm>
  15. #include<functional>//模板类头文件
  16. using namespace std;
  17.  
  18. #define N 100
  19. struct vertex
  20. {
  21. int degree;//顶点的度
  22. int index;//顶点的序号
  23. } v[N];
  24. int cmp(const void *a,const void *b)
  25. {
  26. return ((vertex*)b)->degree-((vertex*)a)->degree;
  27. }
  28.  
  29. int main()
  30. {
  31. int r,k,p,q;//循环变量
  32. int i,j;//顶点序号(用于确定图中边的两个顶点)
  33. int d1;//对剩下的序列排序后第1个顶点(度数最大的顶点)的度数
  34. int T,n;//测试数据个数,湖泊个数
  35. int edge[N][N],flag;//邻接矩阵,是否存在合理乡里关系的标志
  36. scanf("%d",&T);
  37. while(T--)
  38. {
  39. scanf("%d",&n);
  40. for(i=0; i<n; i++)
  41. {
  42. scanf("%d",&v[i].degree);
  43. v[i].index=i;
  44. }
  45. memset(edge,0,sizeof(edge));
  46. flag=1;
  47. for(k=0; k<n&&flag; k++)
  48. {
  49. //对v数组后n-k个元素按非递增顺序排序
  50. qsort(v+k,n-k,sizeof(vertex),cmp);//各参数:1 待排序数组首地址 2 数组中待排序元素数量 3 各元素的占用空间大小 4 指向函数的指针
  51. i=v[k].index;//第k个顶点的序号
  52. d1=v[k].degree;
  53. if(d1>n-k-1) flag=0;
  54. for(r=1; r<=d1&&flag; r++)
  55. {
  56. j=v[k+r].index;//后边d1个顶点中每个顶点的序号
  57. if(v[k+r].degree<=0) flag=0;
  58. v[k+r].degree--;
  59. edge[i][j]=edge[j][i]=1;
  60. }
  61. }
  62. if(flag)
  63. {
  64. puts("YES");
  65. for(p=0; p<n; p++)
  66. {
  67. for(q=0; q<n; q++)
  68. {
  69. if(q) printf(" ");
  70. printf("%d",edge[p][q]);
  71. }
  72. puts(" ");//换行
  73. }
  74. }
  75. else printf("NO\n");
  76. if(T) puts(" ");
  77. }
  78. return 0;
  79. }
  1. //可以根据Havel-hakimi定理推一遍
  2. //把i和d1输出,分别代表序号和度
  3. //每组i和d1如果满足条件,再把j输出,j代表d1后面每个顶点的序号
  4. //1
  5. //7
  6. //4 3 1 5 4 2 1
  7. //3 5
  8. //4
  9. //0
  10. //1
  11. //5
  12. //6
  13. //0 3
  14. //4
  15. //1
  16. //2
  17. //4 2
  18. //5
  19. //1
  20. //1 0 不满足第二层for循环的条件则只输出i和d1
  21. //2 0
  22. //6 0
  23. //5 0

poj 1659 Frogs' Neighborhood( 青蛙的邻居)的更多相关文章

  1. poj 1659 Frogs' Neighborhood (DFS)

    http://poj.org/problem?id=1659 Frogs' Neighborhood Time Limit: 5000MS   Memory Limit: 10000K Total S ...

  2. poj 1659 Frogs' Neighborhood (贪心 + 判断度数序列是否可图)

    Frogs' Neighborhood Time Limit: 5000MS   Memory Limit: 10000K Total Submissions: 6076   Accepted: 26 ...

  3. POJ 1659 Frogs' Neighborhood(可图性判定—Havel-Hakimi定理)【超详解】

    Frogs' Neighborhood Time Limit: 5000MS   Memory Limit: 10000K Total Submissions: 9897   Accepted: 41 ...

  4. POJ1659 Frogs' Neighborhood(青蛙的邻居) Havel-Hakimi定理

    Frogs' Neighborhood Time Limit: 5000MS   Memory Limit: 10000K Total Submissions: 8729   Accepted: 36 ...

  5. POJ 1659 Frogs' Neighborhood(Havel-Hakimi定理)

    题目链接: 传送门 Frogs' Neighborhood Time Limit: 5000MS     Memory Limit: 10000K Description 未名湖附近共有N个大小湖泊L ...

  6. POJ 1659 Frogs' Neighborhood (Havel--Hakimi定理)

    Frogs' Neighborhood Time Limit: 5000MS   Memory Limit: 10000K Total Submissions: 10545   Accepted: 4 ...

  7. Poj 1659.Frogs' Neighborhood 题解

    Description 未名湖附近共有N个大小湖泊L1, L2, ..., Ln(其中包括未名湖),每个湖泊Li里住着一只青蛙Fi(1 ≤ i ≤ N).如果湖泊Li和Lj之间有水路相连,则青蛙Fi和 ...

  8. POJ 1659 Frogs' Neighborhood (贪心)

    题意:中文题. 析:贪心策略,先让邻居多的选,选的时候也尽量选邻居多的. 代码如下: #pragma comment(linker, "/STACK:1024000000,102400000 ...

  9. poj 1659 Frogs' Neighborhood(出入度、可图定理)

    题意:我们常根据无向边来计算每个节点的度,现在反过来了,已知每个节点的度,问是否可图,若可图,输出一种情况. 分析:这是一道定理题,只要知道可图定理,就是so easy了  可图定理:对每个节点的度从 ...

随机推荐

  1. Codeforces Round #419 (Div. 2) A-E

    上紫啦! E题1:59压哨提交成功翻盘 (1:00就做完了调了一个小时,还好意思说出来? (逃)) 题面太长就不复制了,但是配图很可爱所以要贴过来 九条可怜酱好可爱呀 A - Karen and Mo ...

  2. 【洛谷 P3299】 [SDOI2013]保护出题人 (凸包,三分,斜率优化)

    题目链接 易得第\(i\)关的最小攻击力为\(\max_{j=1}^i\frac{sum[i]-sum[j-1]}{x+d*(i-j)}\) 十分像一个斜率式,于是看作一个点\(P(x+d*i,sum ...

  3. 转:修改shape的文字

    Sub 修改shape的文字()'' 修改shape的文字 宏' '    ActiveSheet.Shapes.Range(Array("Flowchart: Connector 193& ...

  4. eWebEditor复制粘贴图片时过滤域名

    1.找到form.js 路径:plugins/frame/scripts/form.js 这个方法: 2.替换这个方法 /** * 处理参数 */ Form.prototype.processReqP ...

  5. selenium启动chrome模拟器模拟手机

    一.如果chrome选项里边有这个模拟设备(比如iPhone 6 Plus): 1.先启动Selenium Grid, 比如命令:java -jar selenium-server-standalon ...

  6. Android检测富文本中的<img标签并实现点击效果

    本文旨在:通过点击一张图片Toast输出位置与url链接. 闲话少说,实现原理大概是酱紫的::通过正则表达式检测富文本内的图片集合并获取url,在src=“xxx” 后面添加 onclick方法,至于 ...

  7. log4j生成日志

    Log4j是Apache的一个开源项目,通过使用Log4j,我们可以控制日志信息输送的目的地是控制台.文件.GUI组件,甚至是套接口服务器.NT的事件记录器.UNIX Syslog守护进程等:我们也可 ...

  8. gc 调优记录

    qps 10,0000 -Xms10240m -Xmx10240m -XX:NewRatio=5 -XX:SurvivorRatio=6 2017-12-19T15:10:14.539+0800: 1 ...

  9. 实习day2:@2X图片,git,coding.net,

    @2X是5和6系列的图片,@3X是6P等大屏的图片 本公司目前只用@2X的图片适配. 比如20X27的图片 1x, 就是原始大小: 用2X, 就除以2,变成10X13.5: 如果用3X的, 就除以3, ...

  10. JAVA实现图的邻接表以及DFS

    一:定义邻接表结构储存图 package 图的遍历; //邻接表实现图的建立 //储存边 class EdgeNode { int index; // 习惯了用index,其实标准写法是(adjVer ...