传送门:http://poj.org/problem?id=1659
一个判断可图的很简单的题,首先怎么判断可图呢?
在这里:
然后就直接搞一搞就好了啊!
还原图的话,就是每次删掉的那个最大的结点的数值后面连的那个数值的个数全部右边。
(这个题输出的答案和样例不一样,对着正确的代码找了半天 bug!!!)
#include <iostream>
#include <cstring>
#include <algorithm>
#include <cstdlib>
using namespace std;
const int maxn = 15;
int n;
int G[maxn][maxn];
struct node
{
int c;
int id;
}q[maxn];
bool cmp(node a,node b)
{
return a.c>b.c;
}
bool dfs(int now)
{
if(now>=n)
{
return true;
}
for(int i=now;i<=n;i++)
{
if(q[i].c<0)
{
return false;
}
}
bool found = true;
for(int i=now;i<=n;i++)
{
if(q[i].c)
{
found = false;
}
}
if(found)
{
return true;
}
else
{
int tmp = q[now].c;
int p = now+1;
while(tmp--)
{
G[q[now].id][q[p].id] = 1;
G[q[p].id][q[now].id] = 1;
q[p++].c--;
}
sort(q+now+1,q+1+n,cmp);
dfs(now+1);
}
}
int main()
{
int T;
cin>>T;
while(T--)
{
memset(G,0,sizeof(G));
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>q[i].c;
q[i].id = i;
}
sort(q+1,q+1+n,cmp);
if(dfs(1))
{
cout<<"YES"<<endl;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
cout<<G[i][j];
if(j<n)
{
cout<<" ";
}
}
cout<<endl;
}
cout<<endl;
}
else
{
cout<<"NO"<<endl;
cout<<endl;
}
}
return 0;
}