haval定理:(转)
Havel算法的思想简单的说如下:
(1)对序列从大到小进行排序。
(2)设最大的度数为 t ,把最大的度数置0,然后把最大度数后(不包括自己)的 t 个度数分别减1(意思就是把度数最大的点与后几个点进行连接)
(3)如果序列中出现了负数,证明无法构成。如果序列全部变为0,证明能构成,跳出循环。前两点不出现,就跳回第一步!
自己的代码:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <stack>
#include <algorithm>
#include <vector>
using namespace std;
const int N=15;
int map[N][N];
int n;
struct Node
{
int num;
int id;
}node[N];
bool cmp(Node a,Node b)
{
return a.num>b.num;
}
int main()
{
int cas;
cin>>cas;
while(cas--)
{
memset(map,0,sizeof(map));
cin>>n;
for(int i=0;i<n;i++)
{
cin>>node[i].num;
node[i].id=i+1;
}
int t;
int flag=1;
for(int i=0;i<n-1;i++)
{
sort(node,node+n,cmp);
int tmp=node[0].num;
t=node[0].id;
node[0].num=0;
if(flag)
for(int j=1;j<=tmp;j++)
{
int v=node[j].id;
node[j].num--;
map[t][v]=map[v][t]=1;
if(node[j].num<0)
{
flag=0;
break;
}
}
t++;
}
if(flag)
{
cout<<"YES"<<endl;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
cout<<map[i][j]<<' ';
}
cout<<endl;
}
cout<<endl;
}
else
cout<<"NO"<<endl<<endl;;
}
return 0;
}
poj 1659 (havel定理)
最新推荐文章于 2020-11-22 23:38:30 发布