程序设计基础14 非二叉树的DFS和BFS

1079 Total Sales of Supply Chain(25 分)

A supply chain is a network of retailers(零售商), distributors(经销商), and suppliers(供应商)-- everyone involved in moving a product from supplier to customer.

Starting from one root supplier, everyone on the chain buys products from one's supplier in a price P and sell or distribute them in a price that is r% higher than P. Only the retailers will face the customers. It is assumed that each member in the supply chain has exactly one supplier except the root supplier, and there is no supply cycle.

Now given a supply chain, you are supposed to tell the total sales from all the retailers.

Input Specification:

Each input file contains one test case. For each case, the first line contains three positive numbers: N (≤10​5​​), the total number of the members in the supply chain (and hence their ID's are numbered from 0 to N−1, and the root supplier's ID is 0); P, the unit price given by the root supplier; and r, the percentage rate of price increment for each distributor or retailer. Then N lines follow, each describes a distributor or retailer in the following format:

K​i​​ ID[1] ID[2] ... ID[K​i​​]

where in the i-th line, K​i​​ is the total number of distributors or retailers who receive products from supplier i, and is then followed by the ID's of these distributors or retailers. K​j​​ being 0 means that the j-th member is a retailer, then instead the total amount of the product will be given after K​j​​. All the numbers in a line are separated by a space.

Output Specification:

For each test case, print in one line the total sales we can expect from all the retailers, accurate up to 1 decimal place. It is guaranteed that the number will not exceed 10​10​​.

Sample Input:

10 1.80 1.00
3 2 3 5
1 9
1 4
1 7
0 7
2 6 1
1 8
0 9
0 4
0 3

Sample Output:

42.4

一,思路详解

    一般来说,对于树的问题,DFS比BSF要好写并且方便。原因在于DFS不需要在Node结构体中再次定义layer等变量,直接比较之后输出到全局变量即可,layer+1可以定义于形参,尤其在解决列举每一层结点数目(需要另建数组,详见A1094)和有关叶节点的供应商问题时尤为显著。

    而BFS需要在Node中定义layer等,事后还要在进行比较判断,BFS也可被称为层序遍历。

二,关于DFS和BFS的写法

1,DFS:

void DFS(int root,int depth) {
	if (node[root].child.size() == 0) {
		ans += node[root].task*pow(rate, depth);
	}
	else {
		for (int i = 0; i < node[root].child.size(); i++) {
			DFS(node[root].child[i], depth + 1);
		}
	}
}

 其他DFS的题目可套用,结构是先判断这一点是否有孩子结点,有的话就操作,没有的话就遍历其孩子,用for循环。

2,BFS:

void Layer(int num) {
	int layer = 0;
	queue<Node> que;
	temp = node[num];
	temp.layer = 0;
	que.push(temp);
	while (!que.empty()) {
		temp = que.front();
		que.pop();
		for (int i = 0; i < temp.child.size(); i++) {
                //尤其注意下面的顺序,现将结点变化,再添加到队列,反过来的话队列中的结点的层数就是               
                //没有变化的,会产生混乱                                    
			node[temp.child[i]].layer = temp.layer + 1;
			que.push(node[temp.child[i]]);
		}
	}
}

注意注释所写

猜你喜欢

转载自blog.csdn.net/qq2285580599/article/details/82629227