Time Limit: 5000MS | Memory Limit: 10000K | |||
Total Submissions: 6397 | Accepted: 2793 | Special Judge |
Description
未名湖附近共有N个大小湖泊L1, L2, ..., Ln(其中包括未名湖),每个湖泊Li里住着一只青蛙Fi(1 ≤ i ≤ N)。如果湖泊Li和Lj之间有水路相连,则青蛙Fi和Fj互称为邻居。现在已知每只青蛙的邻居数目x1, x2, ..., xn,请你给出每两个湖泊之间的相连关系。
Input
第一行是测试数据的组数T(0 ≤ T ≤ 20)。每组数据包括两行,第一行是整数N(2 < N < 10),第二行是N个整数,x1, x2,..., 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
图论PDF书中的第一个定理及其应用,根据度数,判断是否可图,如果可图,求出其邻接矩阵。理解定理就会了……
#include <iostream> #include <cstdio> #include <fstream> #include <algorithm> #include <cmath> #include <deque> #include <vector> #include <list> #include <queue> #include <string> #include <cstring> #include <map> #define PI acos(-1.0) #define mem(a,b) memset(a,b,sizeof(a)) #define sca(a) scanf("%d",&a) #define pri(a) printf("%d\n",a) #define M 100002 #define INF 10000000 using namespace std; typedef long long ll; struct graph { int de,in; }g[16]; bool cmp(graph a,graph b) { return a.de>b.de; } int main() { int t,n,i,j,k,l,d,edge[16][16],flag; cin>>t; while(t--) { cin>>n; for(i=0;i<n;i++) { cin>>g[i].de; g[i].in=i; } mem(edge,0); flag=1; for(k=0;k<n&&flag;k++) { sort(g+k,g+n,cmp); i=g[k].in; d=g[k].de; if(d>n-k-1) flag=0; for(l=1;l<=d&&flag;l++) { j=g[k+l].in; if(g[k+l].de<=0) flag=0; g[k+l].de--; edge[i][j]=edge[j][i]=1; } } if(flag) { puts("YES"); for(i=0;i<n;i++) { for(j=0;j<n;j++) { if(j) cout<<' '; cout<<edge[i][j]; } puts(""); } } else puts("NO"); if(t) puts(""); } return 0; }