MZ Training 2014 #5 D题
2014-10-09 16:35
162 查看
树形dp差点忘完了
。
题目要求每条边都必须有士兵在端点监视—— -_-尼玛每条边只有两个端点啊!!!就是每条边必须至少有一个端点被标记,然后求被标记的最少个数嘛!
经典嘞,赤果果嘞树形dp。没啥好说的。
。
题目要求每条边都必须有士兵在端点监视—— -_-尼玛每条边只有两个端点啊!!!就是每条边必须至少有一个端点被标记,然后求被标记的最少个数嘛!
经典嘞,赤果果嘞树形dp。没啥好说的。
<span style="font-size:18px;color:#33ff33;background-color: rgb(255, 0, 0);">#include<cstdio> #include<iostream> #include<cstring> #include<cstdlib> using namespace std; int n; int in[1510]; int dp[2][1510]; bool vis[2][1510]; int head[1510]; struct edge { int v,next; }e[2300010]; int k=1; void adde(int u,int v) { e[k].v=v; e[k].next=head[u]; head[u]=k++; } int v; int dfs(int tem,int t) { if(head[t]==-1) return 0; if(vis[tem][t]) return dp[tem][t]; vis[tem][t]=1; dp[tem][t]=0; for(int i=head[t];i!=-1;i=e[i].next) { int v=e[i].v; int tmp=0x3f3f3f3f; if(tem) tmp=min(tmp,dfs(0,v)); tmp=min(tmp,dfs(1,v)+1); dp[tem][t]+=tmp; } return dp[tem][t]; } int main() { while(scanf("%d",&n)==1) { memset(in,0,sizeof(in)); memset(vis,0,sizeof(vis)); memset(head,-1,sizeof(head)); for(int i=1;i<=n;i++) { int x,q,y; scanf("%d:(%d)",&x,&q); while(q--) { scanf("%d",&y); adde(x,y); in[y]++; } } int f; for(int i=0;i<n;i++) if(!in[i]) f=i; printf("%d\n",min(dfs(0,f),dfs(1,f)+1)); } return 0; }</span>厂长是大神。。。。
相关文章推荐
- MZ Training 2014 #5 E题
- MZ Training 2014 #6 B题
- MZ Training 2014 #6 C题
- MZ Training 2014 #6 D题
- MZ Training 2014 #8 F题
- 斯坦福iOS7 2013-2014秋Assignment 6的一种答案 #5
- MZ Training 2014 #4 B题
- #5. 【NOI2014】动物园
- MZ Training 2014 #6 A题
- visual studio 2014 新特性
- 2014国内外数据泄密事件大盘点
- [BZOJ3751][NOIP2014][数学][乱搞]解方程
- 笔试 - 2014创新工场涂鸦移动校园招聘测试题 及 答案
- 2014,2015
- 【uoj #17】【codevs3729】【luogu1941】【NOIP2014】飞扬的小鸟
- 在WWDC 2014上,没提到的iOS 8 八大新特性
- 2014秋C++ OJ题解:母牛的故事
- bzoj 3872: [Poi2014]Ant colony (dfs+二分)
- 程序员入门必读 2014十大编程语言推荐
- SQLSERVER2014中的新功能