http://pat.zju.edu.cn/contests/pat-a-practise/1053
链表的操作,dfs遍历
#include <stdio.h>
#include <iostream>
#include <vector>
#include <malloc.h>
#include <algorithm>
using namespace std;
struct Node
{
int weight;
vector<Node* > next; //节点的孩子向量,保存node指针型
};
vector<int> ans; //保存路径上结点权值
vector<int> weight; //保存权值
int total; //给定的路径和
bool cmp(Node* A,Node* B)
{
return A->weight>B->weight;
}
void dfs(Node* curNode,int cur) //深度遍历
{
int i,j;
cur+=curNode->weight;
if (curNode->next.size()==0) //孩子向量空,说明是叶子节点
{
if (cur==total)
{
for (i=0;i<ans.size();i++)
{
if (i==0)
{
printf("%d",ans[i]);
}
else
{
printf(" %d",ans[i]);
}
}
printf("\n");
}
return;
}
else
{
if (cur>total) //还未到叶子,却已经超过给定权值,直接返回
{
return;
}
else
{
sort(curNode->next.begin(),curNode->next.end(),cmp); //对所有孩子节点大小排序,先遍历权值大的
for (j=0;j<curNode->next.size();j++)
{
ans.push_back(curNode->next[j]->weight); //当前节点先放进结果中向量中,若满足就返回,否则到上一层,再pop出来
dfs(curNode->next[j],cur);
ans.pop_back();
}
}
}
}
int main()
{
int n,m,i,j;
scanf("%d%d%d",&n,&m,&total);
vector<Node*> buf(n); //声明向量时就声明大小,就可以对下标操作
for (i=0;i<n;i++)
{
int x;
scanf("%d",&x);
weight.push_back(x);
}
for (i=0;i<n;i++)
{
buf[i]=new Node;
buf[i]->weight=weight[i];
}
for (i=0;i<m;i++)
{
int id,k; //该非叶节点有k个孩子
scanf("%d%d",&id,&k);
for (j=0;j<k;j++)
{
int child;
scanf("%d",&child);
buf[id]->next.push_back(buf[child]);
}
}
ans.push_back(buf[0]->weight); //根节点肯定在路径上
int cur=0; //保存当前权值和
dfs(buf[0],cur);
return 0;
}
//因为输入无序,所以先输入权值,再保存在相应节点
//不要输入孩子时输入权值