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 或 最小顶点覆盖=最大匹配(双向图)(HDU 1053)
- [BZOJ1017][JSOI2008][树形DP]魔兽地图DotR
- ZOJ3824 Fiber-optic Network
- hihocoder #1035 : 自驾旅行 III 树形DP
- POJ 3342
- URAL1018
- hdu1561 zoj3201
- poj 3107 Godfather
- zoj3201Tree of Tree
- Codeforces Round #135 (Div. 2)VD. Choosing Capital for Treeland
- POJ 1848 Tree
- HDU 1561 The more, The Better(树形DP)
- UVALive 6436 The Busiest City
- 树形dp简单总结
- Party at Hali-Bula
- zoj cut the tree(树形dp,小细节真的很多)
- poj 2486 Apple Tree(树形dp)
- poj 1155 TELE(树形泛化背包dp)
- 树形DP
- bzoj1040[骑士] 环型森林(树形dp)