poj1659(贪心构造图)

来源:互联网 发布:java 多线程 锁 编辑:程序博客网 时间:2024/04/30 05:19

题意:给出一个无向图中所有点的度数,要求输出一种图的构造。


解法:就是个贪心,第一次遇到这个题是在长沙区域赛上,当时是一道几乎一样的题目,在场上想到了这个贪心方法,还简单证明了一下,。,。,。但是由于比赛时那个题目过的人很少,加上一直在帮队友调试卡的题目,所以场上没有敲,比赛结束后都有点后悔了,还是水平太逗了,。,。现在做1A,其实真的很简单。就先将度从大到小排序,然后将最大的那个度依次往后分配,然后将剩余点的度再排序进行分配,。,。,。一直迭代到全部分完。中间任何环节出现非法的情况就说明图不存在。


代码:

#include <iostream>#include <algorithm>#include <stdio.h>#include <cstring>using namespace std;struct point{    int position;    int number;} sum[11];bool operator<(point a,point b){    return a.number<b.number;}bool num[11][11];int n;int main(){    //freopen("in.txt","r",stdin);    //freopen("in.txt","r",stdin);   int t;   cin>>t;   while(t--)   {       memset(num,0,sizeof num);       scanf("%d",&n);       for(int i=0;i<n;i++) scanf("%d",&sum[i].number),sum[i].position=i;       bool b=true;       for(int i=0;i<n-1;i++)       {         sort(sum+i,sum+n);         reverse(sum+i,sum+n);         bool flag=true;         if(sum[i].number>n-1-i){b=false;break;}         for(int j=0;j<sum[i].number;j++)            if(sum[j+i+1].number==0)            {                flag=false;                break;            }            else sum[j+i+1].number--,num[sum[i].position][sum[j+i+1].position]=1,num[sum[i+j+1].position][sum[i].position]=1;        if(!flag)        {b=false;break;}       }       if(sum[n-1].number!=0)b=false;       if(!b)        cout<<"NO\n";       else       {           cout<<"YES\n";           for(int i=0;i<n;i++)           {            for(int j=0;j<n;j++)                cout<<num[i][j]<<" ";            cout<<endl;           }       }       cout<<endl;   }}

0 0