1. 程式人生 > >POJ 1659 Frogs' Neighborhood (Havel--Hakimi定理)

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

node body i++ urn .html special wid 個數字 mes

                  Frogs‘ Neighborhood
Time Limit: 5000MS Memory Limit: 10000K
Total Submissions: 10545 Accepted: 4386 Special Judge

Description

未名湖附近共有N個大小湖泊L1, L2, ..., Ln(其中包括未名湖),每個湖泊Li裏住著一只青蛙Fi(1 ≤ iN)。如果湖泊LiLj之間有水路相連,則青蛙FiFj互稱為鄰居。現在已知每只青蛙的鄰居數目x1, x2, ..., xn,請你給出每兩個湖泊之間的相連關系。

Input

第一行是測試數據的組數T(0 ≤ T ≤ 20)。每組數據包括兩行,第一行是整數N(2 < N < 10),第二行是N個整數,x1, x2,..., xn(0 ≤ xiN)。

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://www.cnblogs.com/wzjhoutai/p/6761606.html
這是一片不錯的博客,詳細介紹了Havel--Hakimi定理。
在執行刪點的同時,把邊連起來就行了.
代碼
#include<iostream>
#include<cstdio>
#include
<cstring> #include<algorithm> using namespace std; int mp[15][15]; struct node { int id; int num; }a[15]; bool cmp(node x,node y) { return x.num>y.num; } int main() { int T; scanf("%d",&T); while(T--){ memset(mp,0,sizeof(mp)); int n; scanf("%d",&n); for(int i=0;i<n;i++){ scanf("%d",&a[i].num); a[i].id=i+1; } int tt=n; int flag=0; for(int i=0;i<n;i++){ sort(a,a+n,cmp); if(a[0].num<0){flag=1;break;} int t=a[0].num;a[0].num=0; for(int j=1;j<=t;j++){ a[j].num--;if(a[j].num<0){flag=1;break;} mp[a[j].id][a[0].id]=mp[a[0].id][a[j].id]=1; } if(flag){break;} tt--; } if(flag==1){printf("NO\n\n");continue;} printf("YES\n"); for(int i=1;i<=n;i++){ for(int j=1;j<n;j++){ printf("%d ",mp[i][j]); } printf("%d\n",mp[i][n]); } printf("\n"); } }

 

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