【最小生成树】小天狼星的访问

题目:小天狼星的访问 rqnoj196

题目描述

经过数月的准备,小天狼星,一个被诬陷的杀人犯,准备闯入霍格沃茨见见他的侄子。霍格沃茨的地图呈一颗树状分布。每个房间由若干跳过道通向其他房间。由于小天狼星想尽快找到哈利:
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 )

输出格式

1行:找到哈利的时间(开始时间为0).

样例输入

样例输出

 

看到走过的路不能再走等等就想到了深搜,然后又要累计代价,就写成了深搜+prim

C++ Code

#include<cstdio>
#include<string>
#define MAXN 100+10
#define oo 99999999

int n,p,ans=0,map[MAXN][MAXN];
bool h[MAXN];

void dfs(int i)
{
  int k,min,j;
  while(true)
  {
    k=0;min=oo;
    for(j=1;j<=n;j++)
      if(!h[j] && map[i][j]>0 && min>map[i][j])
        {min=map[i][j];k=j;}
    if(min==oo) return;
    h[k]=true;
    ans+=map[i][k];//从 i 到 k 
    if(k==p){printf("%d",ans);exit(0);}
    dfs(k);
    ans+=map[i][k];//无路可走时从 k 回到 i 
  }
}

int main()
{
  freopen("rqn196.in","r",stdin);
  freopen("rqn196.out","w",stdout);
  scanf("%d%d",&n,&p);
  int i,s,t,l;
  for(i=1;i<=n-1;i++)
  {
    scanf("%d%d%d",&s,&t,&l);
    map[s][t]=l;map[t][s]=l;
  }
  h[0]=true;
  dfs(0);
  printf("%d",ans);
  return 0;
}

 

posted @ 2012-08-18 20:54  jiangzh  阅读(403)  评论(0)    收藏  举报