#include <cstdlib>
#include <iostream>
#include <vector>
#include <string>
using namespace std;
struct node{
vector<node*> children;
int name;
int mSoldiers[2];
int getMin(int i);
} nodes[1500];
/**
i = 1: 向上路上未看守, 此顶点当有士兵
**/
int node::getMin(int i)
{
if (mSoldiers[i] > -1) return mSoldiers[i];
mSoldiers[0] = 0; mSoldiers[1] = 1;
if (children.size() == 0)
{
return mSoldiers[i];
}
for (int x = 0; x < children.size(); x++)
{
int a=children[x]->getMin(0) , b=children[x]->getMin(1);
mSoldiers[0] += b;
mSoldiers[1] += a > b ? b : a;
}
if (mSoldiers[0] > mSoldiers[1]) mSoldiers[0] = mSoldiers[1];
return mSoldiers[i];
}
void dfs(node* rt)
{
for (int i = 0; i < rt->children.size(); i++)
dfs(rt->children[i]);
cout<<rt->name<<" ";
}
int n;
node* Input()
{
string nd;
node* root=NULL;
for (int i=0; i<n; i++)
{
cin>>nd;
//cout<<nd;
int idx = nd.find(':');
int key = 0, neighbor, num=0;
for (int j=0; j < idx; j++)
key = key*10+nd[j]-'0';
for (int j =idx+2; j < nd.length()-1; j++)
num = num*10+nd[j]-'0';
//cout<<" key="<<key<<" num="<<num<<endl;
for (int j = 0; j < num; j++)
{
cin>>neighbor;
nodes[key].children.push_back(&nodes[neighbor]);
if (root == NULL || root == &nodes[neighbor])
root = &nodes[key];
}
//cout<<"root->name="<<root->name<<" ";
}
return root;
}
int main(int argc, char *argv[])
{
while (cin>>n, cin.get()!=EOF)
{
for (int i = 0; i< n; i++)
{
nodes[i].name = i;
nodes[i].mSoldiers[0] = nodes[i].mSoldiers[1] = -1;
}
node* root = Input();
int a = root->getMin(0), b = root->getMin(1);
//dfs(root);
//cout<<endl;
cout<< (a>b?b:a) <<endl;
for (int i = 0; i< n; i++)
nodes[i].children.clear();
}
}
zoj 1134
最新推荐文章于 2017-08-21 13:27:05 发布