您的位置:首页 > 其它

3722: PA2014 Final Budowa|树形DP

2016-03-10 17:16 232 查看
先DFS一遍判断是否无解。

然后再枚举犹豫未决的专家判断

#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<queue>
#include<vector>
#include<set>
#include<map>
#include<iostream>
#include<algorithm>
#define ll unsigned long long
#define N 1022
#define mx 1e9
using namespace std;
int sc()
{
int i=0,f=1; char c=getchar();
while(c>'9'||c<'0'){if(c=='-')f=-1;c=getchar();}
while(c>='0'&&c<='9')i=i*10+c-'0',c=getchar();
return i*f;
}
int head
,lst
,nxt
;
int opt
,col
,a
;
int n,tot,top;
void insert(int x,int y)
{
lst[++tot]=y;nxt[tot]=head[x];head[x]=tot;
}
int dfs(int x)
{
if(col[x]!=2)return col[x];
int sum=0;
for(int i=head[x];i;i=nxt[i])
sum+=dfs(lst[i]);
if(sum>0)return 1;
if(sum<0)return -1;
return 0;
}
int main()
{
n=sc();
for(int i=1;i<=n;i++)
{
int x=sc();
if(x==0)col[i]=0;
else if(x==-2)col[i]=1;
else if(x==-1)col[i]=-1;
else for(int j=1;j<=x;j++)
insert(i,sc()),col[i]=2;
}
int x=dfs(1);
if(x==-1){puts("NIE");return 0;}
else if(x==1)
{
for(int i=1;i<=n;i++)
if(col[i]==0)a[++top]=i;
}else for(int i=1;i<=n;i++)
if(col[i]==0)
{
col[i]=1;
if(dfs(1))a[++top]=i;
col[i]=0;
}
printf("TAK %d\n",top);
for(int i=1;i<=top;i++)
printf("%d%c",a[i],i==top?'\n':' ');
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  树形DP