Time Limit: 20000/10000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 9631 Accepted Submission(s): 4492
Your program should find the minimum number of soldiers that Bob has to put for a given tree.
The input file contains several data sets in text format. Each data set represents a tree with the following description:
the number of nodes
the description of each node in the following format
node_identifier:(number_of_roads) node_identifier1 node_identifier2 ... node_identifier
or
node_identifier:(0)
The node identifiers are integer numbers between 0 and n-1, for n nodes (0 < n <= 1500). Every edge appears only once in the input data.
For example for the tree:
the solution is one soldier ( at the node 1).
The output should be printed on the standard output. For each given input data set, print one integer number in a single line that gives the result (the minimum number of soldiers). An example is given in the following table:
#include <cstdio> #include <iostream> #include <algorithm> #include <cstring> using namespace std; const int maxn = 2005; int f[maxn]; int son[maxn]; int bro[maxn]; int dp[maxn][2]; int vis[maxn]; void dfs(int node){ dp[node][0]=0; dp[node][1]=1; int f=son[node]; while(f!=-1){ dfs(f); dp[node][1]+=min(dp[f][0],dp[f][1]); dp[node][0]+=dp[f][1]; f=bro[f]; } } int main(){ int n; while(cin>>n){ int root=0; memset(vis,0,sizeof(vis)); memset(son,-1,sizeof(son)); memset(f,0,sizeof(f)); for(int i=0;i<n;i++) { int num,cnt; scanf("%d:(%d)",&num,&cnt); for(int j=0;j<cnt;j++) { int num1; cin>>num1; bro[num1] = son[num]; //同一个父节点的上一个兄弟 son[num] = num1; //num的儿子是num1 f[num1] = 1; //num1是有父亲的,为下面找根结点做准备 } } for(int i=0;i<n;i++) { if(!f[i]) //如果没有父亲就可以做为根结点 { root = i; break; } } dfs(root); cout<<min(dp[root][0],dp[root][1])<<endl; } }