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 }