SJTU-ACM-1528

来源:互联网 发布:手机淘宝买东西流程 编辑:程序博客网 时间:2024/06/05 05:34

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 20 1 10 2 21 3 31 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
原创粉丝点击