[NOIP-P0708]小天狼星的访问
题目描述
经过数月的准备,小天狼星,一个被诬陷的杀人犯,准备闯入霍格沃茨见见他的侄子。霍格沃茨的地图呈一颗树状分布。每个房间由若干跳过道通向其他房间。由于小天狼星想尽快找到哈利:
0.他会从房间0开始找
1.他总是会选择离自己最近的房间找
2.如果没找到,则继续选最近的房间深入
3.如果已没有房间可走,则返回到上一个房间,继续选择(往回走也算时间哦)。
4.当然,除了往回走,小天狼星是不会去一个房间两次的。-0-
输入
第1行,n房间个数,p哈利所在的房间。(p<=n<100)
第2-n行,每行3个整数s,t,l。从房间s到房间t的时间l。(s≠t, 0<=s<t< n, 0 <l<=10000)
输出
输出找到哈利的时间(开始时间为0)。
样例输入
5 2 0 1 1 0 2 2 1 3 3 1 4 4
样例输出
18
提示
代码
#pragma GCC optimize(1) #pragma GCC optimize(2) #pragma GCC optimize(3) #pragma GCC optimize("Ofast") #pragma GCC optimize("inline") #include<bits/stdc++.h> #define rep(i,j,k) for(register int i=(j);i<=(k);++i) #define per(i,j,k) for(register int i=(j);i>=(k);--i) using namespace std; template<class T> inline void read(T &x) { x=0; register char c=getchar(); register bool f=0; while(!isdigit(c))f^=c=='-',c=getchar(); while(isdigit(c))x=x*10+c-'0',c=getchar(); if(f)x=-x; } const int N=101; int n,m,f[N][N],a,b,c,ans; bool used[N]; inline void dfs(register int i) { register int j,k,mn; while(1) { k=0,mn=2147483647; rep(j,1,n) if(!used[j]&&f[i][j]>0&&mn>f[i][j]) mn=f[i][j],k=j; if(mn==2147483647) return ; used[k]=1,ans+=f[i][k]; if(k==m) { printf("%d",ans); exit(0); } dfs(k); ans+=f[i][k]; } } int main() { read(n),read(m); rep(i,1,n-1) { read(a),read(b),read(c); f[a][b]=f[b][a]=c; } used[0]=1; dfs(0); printf("%d",ans); return 0; }