小天狼星的访问

A. 小天狼星的访问


Description

经过数月的准备,小天狼星,一个被诬陷的杀人犯,准备闯入霍格沃茨见见他的侄子。霍格沃茨的地图呈一颗树状分布。每个房间由若干跳过道通向其他房间。由于小天狼星想尽快找到哈利:
0.他会从房间0开始找
1.他总是会选择离自己最近的房间找
2.如果没找到,则继续选最近的房间深入
3.如果已没有房间可走,则返回到上一个房间,继续选择(往回走也算时间哦)。
4.当然,除了往回走,小天狼星是不会去一个房间两次的。

Input

第1行,nn房间个数,pp哈利所在的房间。(pn<100)
2n2∼n行,每行3个整数s,t,l。从房间s到房间t的时间l。(st0s<t<n0<l10000)

Output

输出找到哈利的时间(开始时间为0)。

Samples

Input Copy
5 2
0 1 1
0 2 2
1 3 3
1 4 4
Output
18


这个题说如果如果没有别的房间可以走,就返回上一个房间,看到这例非常像dfs中的回溯过程,在一看
数据范围n<100,不用想了就是dfs,你可以按照时间排一下序,页可以不用排,反正数据范围也不大,按照
题目要求第一次走到就是答案
对了:不要忘记vis[0]=1
#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;
typedef pair<int,int> PII;
const int maxn=1e6+100;
const int mm=1e3+100;
int n,p;
struct node{
    int s,t,l;
}a[maxn];
int ss[maxn];
int tt[maxn];
int vis[maxn];
bool cmp(node x,node y){
    if(x.s==y.s){
        return x.l<y.l;
    }
    else{
        return x.s<y.s;
    }
}
int ans=0;
int flag=0;
void dfs(int qi){
    for(int i=1;i<=n-1;i++){
        if(a[i].s==qi&&!vis[i]){
            ans+=a[i].l;
            vis[i]=1;
            if(a[i].t==p){
                printf("%d\n",ans);
                exit(0);
                return ;
            }
            dfs(a[i].t);
            ans+=a[i].l;
        }
    }
}
int main(){
    cin>>n>>p;
    for(int i=1;i<=n-1;i++){
        cin>>a[i].s>>a[i].t>>a[i].l;
    }
    sort(a+1,a+n,cmp);
    vis[0]=1;//一定不要忘记
    dfs(0);
    cout<<ans<<endl;
}

 



posted @ 2021-02-02 22:54  lipu123  阅读(103)  评论(0编辑  收藏  举报