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 }

 

你可能感兴趣的:(poj)