您的位置:首页 > 其它

POJ 1659 根据度序列构图

2012-04-18 19:37 169 查看
题目链接: http://poj.org/problem?id=1659

题目大意:

  给定n个点(n<=10),及每个点的度数,问你是否可以构图满足这样的关系;如果可以输出任意一种构图方式(以邻接矩阵的形式输出,[i][j] == 1,表示点i和点j相连,否则为0表示不相连)。

分析:

  贪心,开始我贪心错了,也就没怎么继续想,拿给lin神看,他直接就说是每次找个度数最大的来进行处理,然后我照他说的写还真就ac了。

  另外,这个贪心是可以证明的,参见Havel定理,http://roba.yo2.cn/articles/%E5%9B%BE%E7%9A%84%E5%BA%A6%E5%BA%8F%E5%88%97-havel%E5%AE%9A%E7%90%86.html;

代码:

POJ 1659

/*1659    Accepted    248K    0MS    C++    1536B    2012-04-18 19:25:23*/
#include <cstdio>
#include <cstring>
#include <cmath>
#include <iostream>
#include <algorithm>
#include <functional>
#include <vector>
using namespace std;

#define mpair make_pair
#define pii pair<int,int>
#define MM(a,b) memset(a,b,sizeof(a));
typedef long long lld;
typedef unsigned long long u64;
template<class T> bool up_max(T& a,const T& b){return b>a? a=b,1 : 0;}
template<class T> bool up_min(T& a,const T& b){return b<a? a=b,1 : 0;}
#define maxn 20
int m[maxn][maxn];
pii a[maxn];

int main()
{
int T,n,i,j,t;
cin>>T;
while( T-- ){
cin>>n;
for(i=1;i<=n;++i){
scanf("%d", &t);
a[i]= pii( t, i );
}
sort( a+1, a+1+n, greater< pii >() );

bool flag= 1;
MM( m, 0 );
for(int k=1;k<=n;++k){
for(i=2; i<=n && a[1].first>0 ; ++i){
if( a[i].first > 0 ){
a[1].first--;
a[i].first--;
m[ a[1].second ][ a[i].second ]= 1;
m[ a[i].second ][ a[1].second ]= 1;
}
}
if( 0 != a[1].first ) flag= 0;
else sort( a+1, a+1+n, greater< pii >() );
}

if( !flag ) puts("NO");
else{
puts("YES");
for(i=1;i<=n;++i)
for(j=1;j<=n;++j)
printf("%d%c", m[i][j], j==n ? '\n' : ' ' );
}

if( T ) puts("");
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: