树的遍历
1090 Highest Price in Supply Chain (25 分)
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/18e9981c905d015230e3f2ff5bf3ae6d.png)
#include<bits/stdc++.h>
using namespace std;
int depth[100000];
vector<int> v[100000];
int root;
void dfs(int father)
{
for(int each:v[father]){
depth[each]=depth[father]+1;
dfs(each);
}
}
int main()
{
int n;
double p,r;
cin>>n>>p>>r;
for(int i=0;i<n;i++){
int father;
cin>>father;
if(father!=-1)v[father].push_back(i);
else root=i;
}
depth[root]=0;
dfs(root);
int maxdepth=0;
for(int i=0;i<n;i++){
if(maxdepth<depth[i])maxdepth=depth[i];
}
int sum=0;
for(int i=0;i<n;i++){
if(depth[i]==maxdepth)sum++;
}
for(int i=0;i<maxdepth;i++){
p=p*(1+r/100);
}
printf("%.2f %d",p,sum);
return 0;
}
1079 Total Sales of Supply Chain (25 分)
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/186366f1989d9a31d67c706e4a82b779.png)
#include<bits/stdc++.h>
using namespace std;
double r,P;
struct node{
int number;
vector<int>child;
};
node v[100000];
double sum=0;
void dfs(int father,double p)
{
if(v[father].child.size()){
for(int each:v[father].child){
dfs(each,p*(1+r/100));
}
}
else{
sum+=v[father].number*p;
}
}
int main()
{
int n;
cin>>n>>P>>r;
for(int i=0;i<n;i++){
int t,c;
cin>>t;
if(t){
while(t--){
cin>>c;
v[i].child.push_back(c);
}
}
else{
cin>>v[i].number;
}
}
dfs(0,P);
printf("%.1f",sum);
return 0;
}
图的遍历
1013 Battle Over Cities (25 分)
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/693e42fa9a8b9804bb8f396d8176c3bb.png)
#include<bits/stdc++.h>
using namespace std;
int N,M,K,visited[1000];
int lost;
vector<int>v[1000];
void dfs(int cur)
{
visited[cur]=1;
for(int i:v[cur]){
if(i!=lost&&visited[i]==0){
dfs(i);
}
}
}
int main()
{
cin>>N>>M>>K;
for(int i=1;i<=M;i++){
int p,q;
cin>>p>>q;
v[p].push_back(q);
v[q].push_back(p);
}
int sum=0;
while(K--){
cin>>lost;
for(int i=1;i<=N;i++)visited[i]=0;
sum=0;
for(int i=1;i<=N;i++){
if(visited[i]==0&&i!=lost){
dfs(i);
sum++;
}
}
cout<<sum-1<<endl;
}
}
1021 Deepest Root (25 分)
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/7912ab0260c5f3925f53bdc602d6d046.png)
#include<bits/stdc++.h>
using namespace std;
int N,visited[10001];
int maxdis=0;
vector<int>v[10001],farestnode;
void dfs(int cur)
{
if(visited[cur])return;
visited[cur]=1;
for(int each:v[cur]){
dfs(each);
}
}
void dfs2(int cur,int deepth)
{
if(visited[cur])return;
visited[cur]=1;
if(deepth>maxdis){
maxdis=deepth;
farestnode.clear();
farestnode.push_back(cur);
}
else if(deepth==maxdis){
farestnode.push_back(cur);
}
for(int each:v[cur]){
dfs2(each,deepth+1);
}
}
set<int>st;
int main()
{
cin>>N;
int p,q;
for(int i=1;i<N;i++){
cin>>p>>q;
v[p].push_back(q);
v[q].push_back(p);
}
int count=0;
fill(visited+1,visited+N+1,0);
for(int i=1;i<=N;i++){
if(!visited[i]){
dfs(i);
count++;
}
}
if(count>1){
printf("Error: %d components",count);
}
else{
fill(visited+1,visited+N+1,0);
dfs2(1,0);
for(int each:farestnode)st.insert(each);
maxdis=0;
farestnode.clear();
fill(visited+1,visited+N+1,0);
dfs2(*st.begin(),0);
for(int each:farestnode)st.insert(each);
}
for(int each:st){
cout<<each<<endl;
}
}
1018 Public Bike Management (30 分)
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/59115863bd0425a3b6369209568cb82d.png)
#include<bits/stdc++.h>
using namespace std;
vector<int>v[501];
int bike[501],dis[501][501],mindis[501];
int finaldis=1000000,finaltake,finalsend;
vector<int>path,finalpath;
int C,Sp,N,M;
void dfs(int curstation,int curdis,int cursend,int curtake)
{
if(curdis>mindis[curstation])return;
path.push_back(curstation);
if(curstation==Sp){
if(curdis<finaldis||(curdis==finaldis&&cursend<finalsend)||(curdis==finaldis&&cursend==finalsend&&curtake<finaltake)){
finaldis=curdis;
finaltake=curtake;
finalsend=cursend;
finalpath=path;
}
}
else{
if(curdis<mindis[curstation])mindis[curstation]=curdis;
for(int i:v[curstation]){
if(curtake+bike[i]<C/2){
dfs(i,curdis+dis[curstation][i],cursend+C/2-curtake-bike[i],0);
}
else{
dfs(i,curdis+dis[curstation][i],cursend,curtake+bike[i]-C/2);
}
}
}
path.pop_back();
}
int main()
{
int i,j,k;
cin>>C>>N>>Sp>>M;
for(i=1;i<=N;i++)cin>>bike[i];
while(M--){
cin>>i>>j>>k;
v[i].push_back(j);
v[j].push_back(i);
dis[i][j]=dis[j][i]=k;
}
fill(mindis,mindis+501,1000000);
dfs(0,0,0,0);
cout<<finalsend<<" ";
cout<<finalpath[0];
for(i=1;i<finalpath.size();i++){
cout<<"->"<<finalpath[i];
}
cout<<" "<<finaltake;
}
1030 Travel Plan (30 分)
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/1bef660ba2a5592ebe96c8bba8395894.png)
#include<bits/stdc++.h>
using namespace std;
vector<int>v[501];
int dis[501][501],cost[501][501];
int mindis[501];
vector<int>path,finalpath;
int finaldis=1000000,finalcost=1000000;
int N,M,S,D;
void dfs(int curcity,int curdis,int curcost)
{
if(curdis>mindis[curcity])return;
path.push_back(curcity);
if(curcity==D){
if(curdis<finaldis||(curdis==finaldis&&curcost<finalcost)){
finalpath=path;
finaldis=mindis[curcity]=curdis;
finalcost=curcost;
}
}
else{
if(curdis<mindis[curcity])mindis[curcity]=curdis;
for(int each:v[curcity]){
dfs(each,curdis+dis[curcity][each],curcost+cost[curcity][each]);
}
}
path.pop_back();
}
int main()
{
int i,j,k,l;
cin>>N>>M>>S>>D;
while(M--){
cin>>i>>j>>k>>l;
v[i].push_back(j);
v[j].push_back(i);
dis[i][j]=dis[j][i]=k;
cost[i][j]=cost[j][i]=l;
}
for(i=0;i<N;i++)mindis[i]=1000000;
dfs(S,0,0);
for(i=0;i<finalpath.size();i++)cout<<finalpath[i]<<" ";
cout<<finaldis<<" "<<finalcost;
}