SJTU-ACM-1528

5 篇文章 1 订阅
5 篇文章 0 订阅

Description

经过数月的准备,小天狼星,一个被诬陷的杀人犯,准备闯入霍格沃茨见见他的侄子。霍格沃茨的地图呈一颗树状分布。每个房间由若干跳过道通向其他房间。由于小天狼星想尽快找到哈利:

  1. 他会从房间0开始找

  2. 他总是会选择离自己最近的房间找,如果仍有多个房间,从序号最小的开始找。

  3. 如果没找到,则继续选最近的房间深入。

  4. 如果已没有房间可走,则返回到上一个房间,继续选择(往回走也算时间哦)。

  5. 当然,除了往回走,小天狼星是不会去一个房间两次的。

Input Format

第1行:n,p,n表示房间个数,p表示哈利所在的房间。

第2 - n行:s,t,l,表示从房间s到房间t的时间为l(0 <= s < t < n)。

Output Format

1行:找到哈利的时间(开始时间为0)。

Sample Input

5 2
0 1 1
0 2 2
1 3 3
1 4 4

Sample Output

18

Hint

对40%的数据:0 < p <= n < 1000。

对100%的数据:0 < p <= n < 100000。

对100%的数据:0 < l <= 2^31-1。

如题。

大体上就是DFS吧。应该也用不到什么多高深的技巧。

我代码里面是首先排序来着。因为感觉要求并不是很高。简单的排了一下就AC了.

没有能一次ac的主要原因在于对100%的数据:0 < l <= 2^31-1。

也就是说int需要改成long long才对。

#include <iostream>
#include <fstream>
#include<cstdio>
#include<cstdlib>
#include<vector>
using namespace std;
#define lop(n,i) for(int i=0;i<n;i++)
#define ci(t) (cin>>t)
#define co(t) (cout<<t)
struct elem
{
    int n;
    long long t;
    elem(int num1=-1,int num2=-1):n(num1),t(num2)
    {
    }
};
struct Node
{
    vector<elem>no;
    long long nt;
    Node ()
    {
        nt=0;
    }
    //time now
};
Node s[100009];
int n,p;
void dfs(int x,int e)
{
	//cout<<"x is: "<<x<<" time is: "<<s[x].nt<<endl;
    if(x==e)
    {
        cout<<s[x].nt<<endl;
        exit(0);
    }
    if (s[x].no.size()==0)return;
    for (int i=0;i<s[x].no.size();i++)
    {
            s[s[x].no[i].n].nt+=(s[x].no[i].t+s[x].nt);
            dfs(s[x].no[i].n,e);
            s[x].nt=(s[x].no[i].t+s[s[x].no[i].n].nt);
    }
}
int main()
{

    cin>>n>>p;
    int fi,se;
    long long tt;
    lop(n-1,i)
    {
        cin>>fi>>se>>tt;
        s[fi].no.push_back(elem(se,tt));
    }
    lop(n,i)
    {
        if (s[i].no.size()==0)continue;//....
        else
            {
                for (int k=0;k<s[i].no.size();k++)
                {
                    for (int j=k+1;j<s[i].no.size();j++)
                    {
                        if (s[i].no[k].t>s[i].no[j].t)
                        {
                            swap(s[i].no[k],s[i].no[j]);
                        }
                        else if (s[i].no[k].t==s[i].no[j].t&&s[i].no[k].n>s[i].no[j].n){
                            swap(s[i].no[k],s[i].no[j]);
                        }
                    }
                }
            }
    }
    dfs(0,p);
    //system("pause");
    return 0;
}

没有用快排和堆排也过了。注意一下输入输出和边界的问题。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值