目录
5.Highest Price in Supply Chain
7.Lowest Price in Supply Chain
1.先根遍历
void preorder(int root){
printf("%d ",martix[root].data);
for(int i=0;i<martix[root].child.size();i++){
preorder(martix[root].child[i]);
}
}
2.层序遍历
void layer(int root){
queue<int> q;
martix[root].layer=0;
q.push(root);
while(!q.empty()){
int now=q.front();
q.pop();
printf("%d ",martix[now].data);
for(int i=0;i<martix[now].child.size();i++){
int child=martix[now].child[i];
martix[child].layer=martix[now].layer+1;
q.push(child);
}
}
}
3.Path of Equal Weight
#include<cstdio>
#include<vector>
#include<cstring>
#include<string>
#include<stack>
#include<set>
#include<map>
#include<ctime>
#include<queue>
#include<math.h>
#include<algorithm>
#include<iostream>
using namespace std;
typedef long long ll;
const int maxn=105;
int n,m,s;
struct{
int data;
vector<int> child;
}martix[maxn];
bool cmp(int a,int b){
return martix[a].data>martix[b].data;
}
int path[maxn];
void dfs(int index,int numnode,int sums){
if(sums>s) return;
if(sums==s){
if(martix[index].child.size()!=0) return;
for(int i=0;i<numnode;i++){
printf("%d",martix[path[i]].data);
if(i<numnode-1) printf(" ");
else printf("\n");
}
return;
}
for(int i=0;i<martix[index].child.size();i++){
int child=martix[index].child[i];
path[numnode]=child;
dfs(child,numnode+1,sums+martix[child].data);
}
}
int main(){
scanf("%d%d%d",&n,&m,&s);
for(int i=0;i<n;i++){
scanf("%d",&martix[i].data);
}
int father,child,num;
for(int i=0;i<m;i++){
scanf("%d %d",&father,&num);
for(int j=0;j<num;j++){
scanf("%d",&child);
martix[father].child.push_back(child);
}
sort(martix[father].child.begin(),martix[father].child.end(),cmp);
}
path[0]=0;
dfs(0,1,martix[0].data);
return 0;
}
4.Total Sales of Supply Chain
#include<cstdio>
#include<vector>
#include<cstring>
#include<string>
#include<stack>
#include<set>
#include<map>
#include<ctime>
#include<queue>
#include<math.h>
#include<algorithm>
#include<iostream>
using namespace std;
typedef long long ll;
const int maxn=100005;
struct{
int data;
vector<int> child;
}martix[maxn];
double p,r;
double ans=0;
void dfs(int index,int depth){
if(martix[index].child.size()==0){
ans+=martix[index].data*pow(1+r,depth);
return;
}
for(int i=0;i<martix[index].child.size();i++){
dfs(martix[index].child[i],depth+1);
}
}
int main(){
int n;
scanf("%d %lf %lf",&n,&p,&r);
r/=100;
int num,child;
for(int i=0;i<n;i++){
scanf("%d",&num);
if(num!=0){
for(int j=0;j<num;j++){
scanf("%d",&child);
martix[i].child.push_back(child);
}
}else{
scanf("%d",&martix[i].data);
}
}
dfs(0,0);
printf("%.1f",ans*p);
return 0;
}
5.Highest Price in Supply Chain
#include<cstdio>
#include<vector>
#include<cstring>
#include<string>
#include<stack>
#include<set>
#include<map>
#include<ctime>
#include<queue>
#include<math.h>
#include<algorithm>
#include<iostream>
using namespace std;
typedef long long ll;
const int maxn=100005;
vector<int> martix[maxn];
int n;
double p,r;
int maxlength=0,num=0;
void dfs(int index,int length){
if(martix[index].size()==0){
if(length>maxlength){
maxlength=length;
num=1;
}else if(length==maxlength){
num++;
}
return;
}
for(int i=0;i<martix[index].size();i++){
dfs(martix[index][i],length+1);
}
}
int main(){
scanf("%d%lf%lf",&n,&p,&r);
r/=100;
int father,root;
for(int i=0;i<n;i++){
scanf("%d",&father);
if(father!=-1){
martix[father].push_back(i);
}else{
root=i;
}
}
dfs(root,0);
printf("%.2f %d\n",p*pow(r+1,maxlength),num);
return 0;
}
6.The Largest Generation
#include<cstdio>
#include<vector>
#include<cstring>
#include<string>
#include<stack>
#include<set>
#include<map>
#include<ctime>
#include<queue>
#include<math.h>
#include<algorithm>
#include<iostream>
using namespace std;
typedef long long ll;
const int maxn=110;
struct{
int layer;
vector<int> child;
}martix[maxn];
int level[maxn]={0};
void bfs(int root){
queue<int> q;
q.push(root);
martix[root].layer=1;
while(!q.empty()){
int now=q.front();
q.pop();
level[martix[now].layer]++;
for(int i=0;i<martix[now].child.size();i++){
int child=martix[now].child[i];
martix[child].layer=martix[now].layer+1;
q.push(child);
}
}
}
int main(){
int n,m;
scanf("%d %d",&n,&m);
int father,num,child;
for(int i=0;i<m;i++){
scanf("%d%d",&father,&num);
for(int j=0;j<num;j++){
scanf("%d",&child);
martix[father].child.push_back(child);
}
}
bfs(1);
int maxlength=-1,maxlevel;
for(int i=1;i<maxn;i++){
if(level[i]>maxlength){
maxlength=level[i];
maxlevel=i;
}
}
printf("%d %d\n",maxlength,maxlevel);
return 0;
}
7.Lowest Price in Supply Chain
#include<cstdio>
#include<vector>
#include<cstring>
#include<string>
#include<stack>
#include<set>
#include<map>
#include<ctime>
#include<queue>
#include<math.h>
#include<algorithm>
#include<iostream>
using namespace std;
typedef long long ll;
const int maxn=100005;
vector<int> martix[maxn];
int minlength=maxn,num;
int n;
double p,r;
void dfs(int index,int order){
if(martix[index].size()==0){
if(order<minlength){
minlength=order;
num=1;
}else if(order==minlength){
num++;
}
return;
}
for(int i=0;i<martix[index].size();i++){
dfs(martix[index][i],order+1);
}
}
int main(){
scanf("%d%lf%lf",&n,&p,&r);
r/=100;
int nums,child;
for(int i=0;i<n;i++){
scanf("%d",&nums);
if(nums!=0){
for(int j=0;j<nums;j++){
scanf("%d",&child);
martix[i].push_back(child);
}
}
}
dfs(0,0);
printf("%.4f %d",p*pow(1+r,minlength),num);
return 0;
}
8.Counting Leaves
#include<cstdio>
#include<vector>
#include<cstring>
#include<string>
#include<stack>
#include<set>
#include<map>
#include<ctime>
#include<queue>
#include<math.h>
#include<algorithm>
#include<iostream>
using namespace std;
typedef long long ll;
const int maxn=101;
struct{
int layer;
vector<int> child;
}martix[101];
int ans[maxn]={0},l=-1;
void bfs(int root){
queue<int> q;
q.push(root);
martix[root].layer=0;
while(!q.empty()){
int now=q.front();
q.pop();
if(martix[now].child.size()==0){
ans[martix[now].layer]++;
if(martix[now].layer>l) l=martix[now].layer;
}
for(int i=0;i<martix[now].child.size();i++){
int child=martix[now].child[i];
martix[child].layer=martix[now].layer+1;
q.push(child);
}
}
}
int main(){
int n,m;
scanf("%d %d",&n,&m);
int father,num,child;
for(int i=0;i<m;i++){
scanf("%d%d",&father,&num);
for(int j=0;j<num;j++){
scanf("%d",&child);
martix[father].child.push_back(child);
}
}
bfs(1);
for(int i=0;i<=l;i++){
printf("%d",ans[i]);
if(i!=l) printf(" ");
}
return 0;
}
#include<cstdio>
#include<vector>
#include<cstring>
#include<string>
#include<stack>
#include<set>
#include<map>
#include<ctime>
#include<queue>
#include<math.h>
#include<algorithm>
#include<iostream>
using namespace std;
typedef long long ll;
const int maxn=101;
vector<int> martix[maxn];
int ans[maxn],l=-1;
void dfs(int index,int layer){
if(martix[index].size()==0){
ans[layer]++;
if(layer>l) l=layer;
return;
}
for(int i=0;i<martix[index].size();i++){
dfs(martix[index][i],layer+1);
}
}
int main(){
int n,m;
scanf("%d%d",&n,&m);
int father,num,child;
for(int i=0;i<m;i++){
scanf("%d %d",&father,&num);
for(int j=0;j<num;j++){
scanf("%d",&child);
martix[father].push_back(child);
}
}
dfs(1,0);
for(int i=0;i<=l;i++){
printf("%d",ans[i]);
if(i!=l) printf(" ");
}
return 0;
}