1053. Path of Equal Weight

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;
}

//因为输入无序,所以先输入权值,再保存在相应节点
//不要输入孩子时输入权值


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值