[NOIP-P0708]小天狼星的訪問

題目描述

通過數月的準備,小天狼星,一個被誣告的殺人犯,準備闖入霍格沃茨見見他的侄子。霍格沃茨的地圖呈一顆樹狀分佈。每一個房間由若干跳過道通向其餘房間。因爲小天狼星想盡快找到哈利:c++

0.他會從房間0開始找git

1.他老是會選擇離本身最近的房間找spa

2.若是沒找到,則繼續選最近的房間深刻code

3.若是已沒有房間可走,則返回到上一個房間,繼續選擇(往回走也算時間哦)。blog

4.固然,除了往回走,小天狼星是不會去一個房間兩次的。-0-get

輸入

第1行,n房間個數,p哈利所在的房間。(p<=n<100)it

第2-n行,每行3個整數s,t,l。從房間s到房間t的時間l。(s≠t, 0<=s<t< n, 0 <l<=10000)ast

輸出

輸出找到哈利的時間(開始時間爲0)。class

樣例輸入

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

樣例輸出

18

提示

代碼sed

#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;
}
相關文章
相關標籤/搜索