| ||||||||||
| Online Judge | Problem Set | Authors | Online Contests | User | ||||||
|---|---|---|---|---|---|---|---|---|---|---|
| Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest | |||||||||
dfs+状态压缩水过了 对当前点u找合法的连边方案 全部点都找到合法方案就返回#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<vector>
using namespace std;
int f[11],g[11][11],n;
vector<int>s[11];
int count_bit(int x)
{
int ret=0;
while(x)
{
ret+=(x&1);
x>>=1;
}
return ret;
}
void init()
{
s[0].push_back(0);
for(int i=1;i<=10;i++)
{
s[i].clear();
for(int j=1;j<1024;j++)
if(count_bit(j)==i)
s[i].push_back(j);
}
}
bool dfs(int u)
{
if(u>n)
{
return true;
}
int v[11],tot=f[u];
for(int i=0;i<s[tot].size() && s[tot][i]<(1<<n);i++)
{
int state=s[tot][i];
if(state&(1<<(u-1))) continue;
memset(v,0,sizeof(v));
for(int j=1;j<=n && state;j++,state>>=1)
if(state&1)
v[j]=1;
int ok=1;
for(int j=1;j<u;j++)
if(g[u][j]!=v[j])
{
ok=0;
break;
}
if(ok)
{
for(int j=u+1;j<=n;j++)
if(v[j])
g[u][j]=g[j][u]=1;
if(dfs(u+1))
return true;
for(int j=u+1;j<=n;j++)
if(v[j])
g[u][j]=g[j][u]=0;
}
}
return false;
}
int main()
{
init();
int t;
cin>>t;
while(t--)
{
cin>>n;
for(int i=1;i<=n;i++)
scanf("%d",&f[i]);
memset(g,0,sizeof(g));
if(dfs(1))
{
puts("YES");
for(int i=1;i<=n;i++)
{
for(int j=1;j<n;j++)
cout<<g[i][j]<<' ';
cout<<g[i][n]<<endl;
}
}
else puts("NO");
puts("");
}
}
Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator