PAT1053-Path of Equal Weight

题目地址:http://pat.zju.edu.cn/contests/pat-a-practise/1053

读题不认真,纠结了半天:Each path occupies a line with printed weights from the root to the leaf in order

其实针对最后输出排序:

将路径(int)Stack[n]保存到(char)S[i]中,按字符串对S[i]进行排序,就能得到符合要求的输出结果了。

C语言源码:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
typedef struct child
{
	int num;
	int w;
}child;
typedef struct node
{
	int w;
	int top;
	child c[200];
}node;
node A[200];
int cmp(const void *a,const void *b)
{
	child *aa=(child *)a;
	child *bb=(child *)b;
	return bb->w-aa->w;
}
int cmp1(const void *a,const void *b)
{
	return strcmp((char *)b,(char *)a);
}
int Stack[200],top,sum,s;
char S[200][200];
int tops[200],nu;
void dfs(int k)
{
	int i;
	sum+=A[k].w;
	Stack[top++]=A[k].w;
	if(A[k].top==0)
	{
		if(sum==s)
		{
			tops[nu]=top;
			for(i=0;i<top;i++)
				S[nu][i]=Stack[i];
			S[nu][i]='\0';
			nu++;
		}
	}
	else
		for(i=0;i<A[k].top;i++)
			dfs(A[k].c[i].num);
	sum-=A[k].w;
	top--;
}
int main()
{
	int n,m,i,num,j,x;
	scanf("%d %d %d",&n,&m,&s);
	for(i=0;i<200;i++)
	{
		A[i].top=0;
		tops[i]=0;
	}
	for(i=0;i<n;i++)
		scanf("%d",&A[i].w);
	for(i=0;i<m;i++)
	{
		scanf("%d",&num);
		scanf("%d",&A[num].top);
		for(j=0;j<A[num].top;j++)
		{
			scanf("%d",&x);
			A[num].c[j].num=x;
			A[num].c[j].w=A[x].w;
		}
		/*qsort(A[num].c,A[num].top,sizeof(A[num].c[0]),cmp);*/
	}
	top=0;sum=0;nu=0;
	dfs(0);
	qsort(S,nu,sizeof(S[0]),cmp1);
	for(i=0;i<nu;i++)
	{
		for(j=0;j<(int)strlen(S[i])-1;j++)
			printf("%d ",S[i][j]);
		printf("%d\n",S[i][j]);
	}
	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值