正如你所知道的 s_sin 是一个贪玩的不得了的小 P 孩(如果你非常讨厌他可以直接跳到
第二段),你也知道他最近很喜欢玩一个叫做太阳帝国的原罪的策略游戏我向你保证这是太
阳帝国原罪系列的最后一章了。
你知道 s_sin 目前已经占领了 n 个行星,并且在 n 个行星之间有 n-1 个相位转移通道,
s_sin 的胜利已经指日可待了! 他深知一个会打战的国王并不一定能够振兴经济, 但是他希
望自己能够全知全能。 我们知道行星间的物资通过相位转移通道进行流通。 每个相位转移通
道上都有一个物资流通交易量。 现在他想废除一些交易量比较小的路径, 你能告诉他在他统
治的这一个 n 元行星群中间有多少条路径上的交易量不大于 k。
★数据输入
输入第一行为两个正整数 N,K (2 < n< 30000), 表示有 n 个城市,编号为 1 到 n。
接下来 N-1 行,每行三个整数 a b t ,表示 a b 之间有一条相位转移通道, 在该相位转
移通道交易量为 t
其中 80% (1<n<=1000)
★数据输出
输出这个 n 元行星群中间有多少条路径上的交易量不大于 K
输入示例 输出示例
5 4 8
1 2 3
1 3 1
1 4 2
3 5 1
#include <stdio.h>
#include <stdlib.h>
struct Graph
{
int number;
int data;
Graph *next;
};
int count=0;
void Find(int n,Graph **list,int list_number,int cur_sum,int prev){
Graph *p=list[list_number];
while(p!=NULL)
{
if(p->number!=prev && cur_sum+p->data<=n)
{
count++;
Find(n,list,p->number,cur_sum+p->data,list_number);
}
p=p->next;
}
}
int main(void)
{
int N,K,i;
scanf("%d%d",&N,&K);
Graph **list=(Graph **)malloc((N+1)*sizeof(Graph *));
Graph **temp_list=(Graph **)malloc((N+1)*sizeof(Graph *));
for(i=1;i<N+1;i++)
{
list[i]=NULL;
temp_list[i]=NULL;
}
int a,b,t;
for(i=1;i<N;i++)
{
scanf("%d%d%d",&a,&b,&t);
if(list[a]!=0)
{
temp_list[a]->next=(Graph *)malloc(sizeof(Graph));
temp_list[a]->next->number=b;
temp_list[a]->next->data=t;
temp_list[a]->next->next=NULL;
temp_list[a]=temp_list[a]->next;
}
else
{
list[a]=(Graph *)malloc(sizeof(Graph));
list[a]->number=b;
list[a]->data=t;
list[a]->next=NULL;
temp_list[a]=list[a];
}
if(list[b]!=0)
{
temp_list[b]->next=(Graph *)malloc(sizeof(Graph));
temp_list[b]->next->number=a;
temp_list[b]->next->data=t;
temp_list[b]->next->next=NULL;
temp_list[b]=temp_list[b]->next;
}
else
{
list[b]=(Graph *)malloc(sizeof(Graph));
list[b]->number=a;
list[b]->data=t;
list[b]->next=NULL;
temp_list[b]=list[b];
}
}
for(i=1;i<N+1;i++)
Find(K,list,i,0,-1);
printf("%d",count/2);
return 0;
}