3722: PA2014 Final Budowa|树形DP

来源:互联网 发布:mysql 5.6 character 编辑:程序博客网 时间:2024/06/06 15:43

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 1e9using 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[N],lst[N],nxt[N];int opt[N],col[N],a[N];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;}
0 0
原创粉丝点击