1079サプライチェーンの総売上(25分)(探索木の深さ優先トラバーサル(二次元ベクトル行列))

サプライチェーンの1079年の総売上高(25分)

サプライチェーンは、小売業者(零售商)、ディストリビュータ(经销商)のネットワークであり、供給者(商供应) - 誰もが顧客に供給業者から製品を移動させることに関与します。

1社のルートのサプライヤーから始まり、チェーン上の誰もが価格Pに1のサプライヤから製品を購入し、R%のみの小売業者は、顧客に直面するだろうP.より高い価格でそれらを販売したり、配布します。サプライチェーンの各メンバーは、ルート業者以外は、正確に1つのサプライヤを有すると仮定される、およびNO供給サイクルは存在しません。

今、あなたはすべての小売業者からの総売上高を伝えることになっている、サプライチェーンを与えられました。

入力仕様:

各入力ファイルには、1つのテストケースが含まれています。ルート供給者(5≤10)N、サプライチェーンにおけるメンバーの合計数(したがってそのIDは0からN-1まで番号付けされ、そして各場合について、最初の行は、3つの正の数字が含まれていIDは0)です。P、ルート業者によって与えられた単価。およびr、各代理店または小売店の価格増加のパーセント率。次いで、N行は、それぞれ次の形式で販売代理店または小売店を説明し、次のとおりです。

K I ID [1] ID [2] ... ID [KのI]

ここで、i行目で、K iは、サプライヤからのI製品を受け取る代理店または小売業者の総数であり、そしてこれらの代理店または小売業者のIDが続いています。K jが0であることは、j番目のメンバーが、代わりに、製品の総量がK jの後に説明する、小売業者であることを意味します。行のすべての数字は、スペースで区切られます。

出力仕様:

各テストケースの場合は、1行に、我々は小数第​​1位まで正確にすべての小売業者から期待できる総売上高を印刷します。数が10 10を超えないことが保証されます。

サンプル入力:

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

サンプル出力:

42.4

 

ツリートラバーサル:

/ **
タイトルのお金の増分はR、nはノード(1 + R)*(1がある場合 + r)が* ...(N 番目)!=(1 + R *の N)
この質問のアイデアはに出発点の下に格納されています全てのパス計算値の深さ優先探索全販売局パスプロ(ツリー構造)  
* /

この方法の一つ:

/**
本题 金钱递增是R  如果有n个结点 (1+r) * (1+r) * . . .(n个) != (1+r*n)
此题思路就是存储下起点到所有临售站的路径(构成了一颗树)通过深度优先搜索将所有路径的值计算  
**/ 
#include<iostream>
#include<vector>
#include<cmath>
using namespace std;
struct Node{
	int k;
	int to;
	int cost;
	Node(int to, int k,int costt=0.0): k(k), to(to), cost(costt){ }   //带有默认参数的变量需要放在后面 
};
int n, to, k, cost, num;
double p, r, sum;
vector<vector<Node>> a(100001); 
void dfs(int start,int num){
	
	if(a[start][0].k == 0) {
		sum +=  pow(r+1, num) * p * a[start][0].cost;
		return;
	}
	for(int i = 0; i < a[start].size(); i++){
		dfs(a[start][i].to, num + 1); // num + 1保留了 num原地址值,num++不会保存 
		
	}
	
}
int main(){
	scanf("%d%lf%lf", &n, &p, &r);
	r = r / 100;
	for(int i = 0; i < n; i++){
		scanf("%d", &k);
		if(k==0){
			scanf("%d", &cost);
			a[i].push_back(Node(i, k, cost));
		}else{
			for(int j = 0; j < k; j++){
				scanf("%d", &to);
				a[i].push_back(Node(to, k));
			}	
	   }
	}
	dfs(0);
	printf("%.1f",sum);
	return 0;
}

方法II:使用して、方法C ++内積計算: 

思考:/ **
inner_product(beg1、END1、beg2、INIT); https://blog.csdn.net/richenyunqi/article/details/80139424
beg1、END1は包括配列イテレータを示し、beg2は秒を表します。第一の配列イテレータは、第一の配列の要素数が同じ処理を行い
乗算と2つの配列の対応する要素からそれらを蓄積し、initによって指定された初期値、及び最終的な最終的なを返しますそしてinitによって指定されたタイプ。
** /

#include<iostream>
#include<vector>
#include <algorithm>
using namespace std;
const int maxsize = (int)1e5+5; //科学计数法,e代表10 表示 10的6次方 
//vector<vector<int>> path(maxsize); //全局定义好的常量可以赋范围 
vector<int> path[maxsize]; 
int n,k,to,product[maxsize];
double price[maxsize], r, sum;
 
void dfs(int start){    //深度遍历 ,将临售站最终金钱 * 润率计算出来 
	for(int i = 0; i < path[start].size(); i++){
		price[path[start][i]] = price[start] * (1 + r / 100);
		dfs(path[start][i]);
	}
}
int main(){
	scanf("%d%lf%lf", &n, &price[0], &r);
	for(int i = 0; i < n; i++){
		scanf("%d", &k);
		if(k == 0){
			scanf("%d", &product[i]);
		}
		while(k--){
			scanf("%d", &to);
			path[i].push_back(to);
		}
//		for(int i = 0; i < k; i++){ //这里用for循环为41.8.. 
//			scanf("%d", &to);
//			path[i].push_back(to);
//		}
	}
	dfs(0);
//	sum = inner_product(price, price+n, product, 0.0);
//	for(int i = 0; i < n; i++){
//		sum += product[i] * price[i];
//	}
	printf("%.1f", inner_product(price, price+n, product, 0.0));
	return 0;
}

 

おすすめ

転載: blog.csdn.net/qq_41698081/article/details/91126193