zoukankan      html  css  js  c++  java
  • POJ1659 Frogs' Neighborhood(青蛙的邻居) Havel-Hakimi定理

    Frogs' Neighborhood
    Time Limit: 5000MS   Memory Limit: 10000K
    Total Submissions: 8729   Accepted: 3676   Special Judge

    Description

    未名湖附近共有N个大小湖泊L1L2, ..., Ln(其中包括未名湖),每个湖泊Li里住着一只青蛙Fi(1 ≤ i ≤ N)。如果湖泊LiLj之间有水路相连,则青蛙FiFj互称为邻居。现在已知每只青蛙的邻居数目x1x2, ..., xn,请你给出每两个湖泊之间的相连关系。

    Input

    第一行是测试数据的组数T(0 ≤ T ≤ 20)。每组数据包括两行,第一行是整数N(2 < N < 10),第二行是N个整数,x1x2,..., 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 

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



    分析:
      给定一个非负整数序列,问是不是一个可图的序列,也就是说能不能根据这个序列构造一个图。
    利用Havel-Hakimi定理。
      (1)某次对剩下的序列进行非递增排序后,最大的度数degree超过了剩下的顶点数
      (2)对最大度数后面的degree个数依次减1,出现了负数。
      出现以上2种情况之一,则判定该序列不可图。



    #include<iostream>
    #include<cstdio>
    #include<algorithm>
    #include<cstring>
    using namespace std;
    #define N 15
    struct vertex
    {
        int degree;
        int index;
    }V[N];
    bool cmp(vertex x,vertex y)
    {
        return x.degree>y.degree;
    }
    int main()
    {
         int i,j,t,k,T,n,flag;
         int Edge[15][15];
         cin>>T;
         while(T--)
         {
             cin>>n;
             for(i=0;i<n;i++)
             {
                 cin>>V[i].degree;
                 V[i].index=i;
             }
             memset(Edge,0,sizeof(Edge));
             flag=1;
             for(k=0;k<n&&flag;k++)
             {
                 sort(V+k,V+n,cmp);
                 i=V[k].index;
                 if(V[k].degree>n-k-1) flag=0;
                 for(t=1;t<=V[k].degree&&flag;t++)
                 {
                     j=V[k+t].index;
                     V[k+t].degree-=1;
                     if(V[k+t].degree<0) flag=0;
                     Edge[i][j]=Edge[j][i]=1;
                 }
             }
             if(flag)
             {
                 cout<<"YES"<<endl;
                 for(i=0;i<n;i++)
                 {
                     for(j=0;j<n-1;j++)
                        cout<<Edge[i][j]<<" ";
                     cout<<Edge[i][j]<<endl;
                 }
                 cout<<endl;
             }
             else cout<<"NO"<<endl<<endl;
         }
        return 0;
    }
    

      




    I am a slow walker,but I never walk backwards.
  • 相关阅读:
    .NET笔试题集(四)
    jquery弹出遮掩层
    LINQ学习(八):强制立即执行
    .NET笔试题集(五)
    LINQ学习(六):OrderBy/Group By子句
    .NET笔试题集(二)
    LINQ学习(九):LINQ to SQL简单应用
    TFS Branch脚本
    分享幻灯片+在线阅读
    C#笔记(五):文件和流
  • 原文地址:https://www.cnblogs.com/GeekZRF/p/4908945.html
Copyright © 2011-2022 走看看