南邮 OJ 1628 销售网络问题

销售网络问题

时间限制(普通/Java) :  1000 MS/ 3000 MS          运行内存限制 : 65536 KByte
总提交 : 167            测试通过 : 56 

比赛描述

华为公司积极开拓北美市场,首先在北美建立销售总部,总部在附近地区发展一些销售点,这些销售点可以发展建立下一级销售点,依此类推,最终形成一个新型分级销售网络。假设在销售网络中,有N个销售点(包括总部),将它们分别编号为1至N。考虑到金融危机,销售总部决定撤销一些销售点,保留其他销售点。需要注意是:

(1)如果撤销一个销售点,那么该销售点发展的所有下级销售点均要撤销,依此类推;

(2)销售总部不能撤销自己;

(3)销售总部可以不撤销任何销售点。

请你帮忙告诉华为公司:共存在多少个销售点撤销方案。




输入

输入包括多个行,首先给出一个整数N,接着N-1行给出销售网络的建立过程,在这N-1行中,第j行(1≤j≤N-1)给出一个整数k(i<k),表示销售点k发展了销售点j。销售点N就是销售总部。


输出

输出一行,给出销售点撤销方案数。

样例输入

3
2
3

样例输出

3

提示

样例有3个销售点(包括总部),“销售点2”发展了“销售点1”,“销售点3 发展了“销售点2”,根据描述,有以下3种销售点撤销方案:(1)不撤销任何销售点;(2)撤销“销售点1”;(3)撤销“销售点1”、“销售点2”。


题目来源

NUPT






#include<iostream>
#include<vector>
using namespace std;

class linkNode{
public:
	int i;
	linkNode *next;
};

class sellNode;
vector<sellNode> nodes;

class sellNode{
public:
	linkNode *head;
	void addChild(int i){
		if(head == NULL){
			head = new linkNode();
			head->i = i;
			return;
		}
		linkNode *p=head;
		while(p->next != NULL){
			p = p->next;
		}
		p->next = new linkNode();
		p = p->next;
		p->i = i;
	}
	int removeMethod(){
		if(head==NULL){
			return 2;
		}else{
			int n=1;
			while(head!=NULL){
				n *= nodes[head->i].removeMethod();
				head = head->next;
			}
			return n+1;
		}
	}
};

int main(){
	int N, i, k;
	cin>>N;
	nodes.resize(N+1);
	for(i=1; i<N; i++){
		cin>>k;
		nodes[k].addChild(i);
	}
	cout<<nodes[N].removeMethod()-1<<endl;
}


你可能感兴趣的:(ACM,南邮OJ,销售网络问题)