【最小生成树】小天狼星的访问
题目:小天狼星的访问 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;
}

..... 转载请注明出处 ..... http://oijzh.cnblogs.com ..... by jiangzh
浙公网安备 33010602011771号