Sins ofa Solar Empire

★实验任务
正如你所知道的 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;
}


       

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值