POJ-1659 Frogs' Neighborhood Havel-Hakimi定理|贪心可图化

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

  给定无向图的度序列,求出图的可能邻接矩阵。如果该度序列能构成图,则称该序列是可图的。这里就是求度序列是否能可图化,其实算法仔细想下还是能想出来的,当时就想到是排序然后贪心选取了。其过程就是一个Havel-Hakimi定理:

               1、度序列排序成非升序

               2、从度序列的第一个数向其后的点构成边,直到其度数用完为止。如果没有用完,则不能可图化。

               3、如果度数全部用完,则构图完成,否则进行第一步。

 1 //STATUS:C++_AC_0MS_164KB
 2 #include<stdio.h>
 3 #include<stdlib.h>
 4 #include<string.h>
 5 #include<math.h>
 6 #include<iostream>
 7 #include<string>
 8 #include<algorithm>
 9 #include<vector>
10 #include<queue>
11 #include<stack>
12 using namespace std;
13 #define LL __int64
14 #define pdi pair<int,int>
15 #define Max(a,b) ((a)>(b)?(a):(b))
16 #define Min(a,b) ((a)<(b)?(a):(b))
17 #define mem(a,b) memset(a,b,sizeof(a))
18 #define lson l,mid,rt<<1
19 #define rson mid+1,r,rt<<1|1
20 const int N=30,M=1000000,INF=0x3f3f3f3f,MOD=1999997;
21 const LL LLNF=0x3f3f3f3f3f3f3f3fLL;
22 const double DNF=100000000000;
23 
24 struct Node{
25     int a,id;
26 }num[N];
27 int w[N][N];
28 int T,n;
29 
30 int cmp(const Node& a,const Node& b)
31 {
32     return a.a>b.a;
33 }
34 
35 int main()
36 {
37  //   freopen("in.txt","r",stdin);
38     int i,j,ok;
39     scanf("%d",&T);
40     while(T--)
41     {
42         ok=1;
43         mem(w,0);
44         scanf("%d",&n);
45         for(i=0;i<n;i++){
46             scanf("%d",&num[i].a);
47             num[i].id=i;
48         }
49 
50         for(i=0;i<n;i++){
51             sort(num,num+n,cmp);
52             for(j=1;j<n && num[0].a;j++){
53                 if(num[j].a){
54                     num[0].a--;num[j].a--;
55                     w[num[0].id][num[j].id]=w[num[j].id][num[0].id]=1;
56                 }
57              }
58              if(num[0].a){ok=0;break;}
59         }
60 
61         if(!ok)printf("NO\n");
62         else {
63             printf("YES\n");
64             for(i=0;i<n;i++){
65                 printf("%d",w[i][0]);
66                 for(j=1;j<n;j++)
67                     printf(" %d",w[i][j]);
68                 putchar('\n');
69             }
70         }
71         if(T)putchar('\n');
72     }
73     return 0;
74 }

 

posted @ 2013-02-03 00:33  zhsl  阅读(279)  评论(0编辑  收藏  举报