A1053

news/2024/12/29 16:21:13/

本题最重要的点:
由于最后的输出需要按权值从大到小排序,因此在读入时要事先对每个结点的子节点vector进行排序(即对vector中的结点按权值从大到小排序),这样在遍历时就会优先遍历到权值大的子结点. 开始没有做这个预处理,导致最后难以对获取到的数据进行排序.
注意点:cmp()见下.
通过DFS寻找到路径上权值总和=s的所有叶子结点并存储下来,然后通过叶子结点向上寻找其父结点.比较繁琐.

#include<cstdio>
#include<cstdlib>
#include<string.h>
#include<math.h>
#include<iostream>
#include<vector>
#include<set>
#include<map>
#include<stack>
#include<queue>
#include<string>
#include<algorithm>
using namespace std;
const int maxn=1010;
struct node{int father;int weight;vector<int> child;
}nodes[maxn];
vector<int> leaf;
int s,num=0;
void dfs(int root,int w){if(nodes[root].child.size()==0){if(w==s){leaf.push_back(root);}return;}for(int i=0;i<nodes[root].child.size();i++){dfs(nodes[root].child[i],w+nodes[nodes[root].child[i]].weight);}
}
bool cmp(int a,int b){return nodes[a].weight>nodes[b].weight;                     //此处不能通过if判断两者不等后再return,会导致最后一个测试点发生段错误(因为当数组中所有数均相等时,if语句将永远不为真) 
}
int main(){#ifdef ONLINE_JUDGE#elsefreopen("1.txt","r",stdin);#endifint n,m,id,k,t[maxn];scanf("%d%d%d",&n,&m,&s);for(int i=0;i<n;i++){scanf("%d",&nodes[i].weight);}for(int i=0;i<m;i++){scanf("%d%d",&id,&k);for(int j=0;j<k;j++){scanf("%d",&t[j]);}sort(t,t+k,cmp);for(int j=0;j<k;j++){nodes[id].child.push_back(t[j]);nodes[t[j]].father=id;}}nodes[0].father=-1;dfs(0,nodes[0].weight);vector<int> res;for(int i=0;i<leaf.size();i++){int now=leaf[i];while(now!=-1){res.push_back(nodes[now].weight);now=nodes[now].father;}for(int j=res.size()-1;j>=0;j--){printf("%d",res[j]);if(j!=0){printf(" ");}}printf("\n");res.clear(); }return 0;
}

DFS同时将数据输出.
//用数组存放路径,利用idx更新下标

#include<cstdio>
#include<cstdlib>
#include<string.h>
#include<math.h>
#include<iostream>
#include<vector>
#include<set>
#include<map>
#include<stack>
#include<queue>
#include<string>
#include<algorithm>
using namespace std;
const int maxn=1010;
int s,path[maxn];
struct node{int weight;vector<int> child;
}nodes[maxn]; 
bool cmp(int a,int b){return nodes[a].weight>nodes[b].weight;                  //注意:比较的是结点的权值,而不是结点标号 
}
void DFS(int root,int idx,int w){if(w>s){return;}else if(w==s){if(nodes[root].child.size()==0){path[idx]=root;for(int i=0;i<=idx;i++){printf("%d",nodes[path[i]].weight);if(i!=idx){printf(" ");}}printf("\n");}return;}else{path[idx]=root;}for(int i=0;i<nodes[root].child.size();i++){DFS(nodes[root].child[i],idx+1,w+nodes[nodes[root].child[i]].weight);}
}
int main(){#ifdef ONLINE_JUDGE#elsefreopen("1.txt","r",stdin);#endifint n,m,id,k,t[maxn];scanf("%d%d%d",&n,&m,&s);for(int i=0;i<n;i++){scanf("%d",&nodes[i].weight);}for(int i=0;i<m;i++){scanf("%d%d",&id,&k);for(int j=0;j<k;j++){scanf("%d",&t[j]);}sort(t,t+k,cmp);for(int j=0;j<k;j++){nodes[id].child.push_back(t[j]);}}DFS(0,0,nodes[0].weight);return 0;
}

//用vector存放路径,利用push,pop操作.

#include<cstdio>
#include<cstdlib>
#include<string.h>
#include<math.h>
#include<iostream>
#include<vector>
#include<set>
#include<map>
#include<stack>
#include<queue>
#include<string>
#include<algorithm>
using namespace std;
const int maxn=1010;
int s;
struct node{int weight;vector<int> child;
}nodes[maxn]; 
vector<int> path;
bool cmp(int a,int b){return nodes[a].weight>nodes[b].weight;                  //注意:比较的是结点的权值,而不是结点标号 
}
void DFS(int root,int w){if(w>s){return;}else if(w==s){if(nodes[root].child.size()==0){for(int i=0;i<path.size();i++){printf("%d",nodes[path[i]].weight);if(i!=path.size()-1){printf(" ");}}printf("\n");}return;}for(int i=0;i<nodes[root].child.size();i++){path.push_back(nodes[root].child[i]);DFS(nodes[root].child[i],w+nodes[nodes[root].child[i]].weight);path.pop_back();}
}
int main(){#ifdef ONLINE_JUDGE#elsefreopen("1.txt","r",stdin);#endifint n,m,id,k,t[maxn];scanf("%d%d%d",&n,&m,&s);for(int i=0;i<n;i++){scanf("%d",&nodes[i].weight);}for(int i=0;i<m;i++){scanf("%d%d",&id,&k);for(int j=0;j<k;j++){scanf("%d",&t[j]);}sort(t,t+k,cmp);for(int j=0;j<k;j++){nodes[id].child.push_back(t[j]);}}path.push_back(0);DFS(0,nodes[0].weight);return 0;
}

http://www.ppmy.cn/news/168424.html

相关文章

poj2385 - Apple Catching

想看更多的解题报告: http://blog.csdn.net/wangjian8006/article/details/7870410 转载请注明出处&#xff1a;http://blog.csdn.net/wangjian8006 题目大意&#xff1a;有两个树&#xff0c;每分钟在某棵树的一颗会掉落一个苹果&#xf…

1158 -- 关于521

关于521 Time Limit:1000MS Memory Limit:65536K Total Submit:180 Accepted:121 Description Acm队的流年对数学的研究不是很透彻&#xff0c;但是固执的他还是想一头扎进去。 浏览网页的流年忽然看到了网上有人用玫瑰花瓣拼成了521三个数字&#xff0c;顿时觉得好浪漫&am…

苹果5

苹果5不连接电脑怎么办

苹果发布Apple Watch 5手表,是否值得购买?这真的要看个人!!!

昨天有一位粉丝问我&#xff0c;苹果新推出的Apple Watch 5值不值得下手购买&#xff0c;今天我按照我的个人立场来说一下这个“手表”值得购买吗&#xff1f;个人观点&#xff0c;不喜欢勿喷。本次拿瑞士入门手表做对比。 Apple Watch 5优势分析 就在9月11日凌晨苹果秋季发布…

nyoj-975-关于521

关于521 时间限制&#xff1a; 1000 ms | 内存限制&#xff1a; 65535 KB 难度&#xff1a; 2 描述 Acm队的流年对数学的研究不是很透彻&#xff0c;但是固执的他还是想一头扎进去。 浏览网页的流年忽然看到了网上有人用玫瑰花瓣拼成了521三个数字&#xff0c;顿时觉得好浪漫…

React中的懒加载以及在Ice中实践

您好&#xff0c;如果喜欢我的文章&#xff0c;可以关注我的公众号「量子前端」&#xff0c;将不定期关注推送前端好文~ 前言 对于页面性能优化&#xff0c;组件懒加载是个比较不错的方案&#xff0c;并且在整个项目打包后&#xff0c;如果未做代码分割&#xff0c;构建出的文…

【华为OD机试真题2023B卷 JAVAJS】支持优先级的队列

华为OD2023(B卷)机试题库全覆盖,刷题指南点这里 支持优先级的队列 知识点队列 时间限制:1s 空间限制:256MB 限定语言:不限 题目描述: 实现一个支持优先级的队列,高优先级先出队列;同优先级时先进先出。 如果两个输入数据和优先级都相同,则后一个数据不入队列被丢弃。…

安装Docker使用Docker安装部署MySQL和Redis

Docker安装 sudo yum remove docker docker-client docker-client-latest docker-common docker-latest docker-latest-logrotate docker-logrotate docker-engine sudo yum remove -y yum-utils sudo yum install -y yum-utils sudo yum-config-manager --add-re…