计蒜客习题:画图游戏
题目
样例
思路
由于答案不唯一,所以选择最简单的方案即可,由度数从大到小看,将度数最大点与前度数个点连边,被连边的点度数减少,反复操作,直到所有点的度数分配好。
代码
#include<iostream>
#include<algorithm>
using namespace std;
int n;
int mp[20][20];
struct node
{
int pos,d;
}du[20];
bool cmp(node a,node b)
{
if(a.d!=b.d) return a.d>b.d;
else return a.pos<b.pos;
}
int main()
{
cin>>n;
for(int i=0;i<n;i++)
{
cin>>du[i].d;
du[i].pos=i;
}
sort(du,du+n,cmp);
while(du[0].d)
{
for(int i=1;i<=du[0].d;i++)
{
mp[du[0].pos][du[i].pos]=mp[du[i].pos][du[0].pos]=1;
du[i].d--;
if(du[i].d<0) {cout<<"None";return 0;}
}
du[0].d=0;
sort(du,du+n,cmp);
}
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
{
if(!j) cout<<mp[i][j];
else cout<<" "<<mp[i][j];
}
cout<<endl;
}
return 0;
}