小天狼星的访问
A. 小天狼星的访问
Description
经过数月的准备,小天狼星,一个被诬陷的杀人犯,准备闯入霍格沃茨见见他的侄子。霍格沃茨的地图呈一颗树状分布。每个房间由若干跳过道通向其他房间。由于小天狼星想尽快找到哈利:
0.他会从房间0开始找
1.他总是会选择离自己最近的房间找
2.如果没找到,则继续选最近的房间深入
3.如果已没有房间可走,则返回到上一个房间,继续选择(往回走也算时间哦)。
4.当然,除了往回走,小天狼星是不会去一个房间两次的。
Input
第1行,nn房间个数,pp哈利所在的房间。(p≤n<100)
第2∼n2∼n行,每行3个整数s,t,l。从房间s到房间t的时间l。(s≠t, 0≤s<t<n, 0<l≤10000)
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; }