挖地雷_1996年分区联赛提高组之三_ssl1071_dfs

Description

  在一个地图上有N个地窖(N<=20),每个地窖中埋有一定数量的地雷。同时,给出地窖之间的连接路径。 
  例如: 

Input

Output

K1 K2,……,KV(挖地雷的顺序) 
MAX (挖地雷的数量) 

Sample Input

5                                       

10 8 4 7 6             

1 1  1  0

  0  0  0

     1  1

        1

Sample Output

1 3 4 5

27

思路:

有人说是dp题,但是因为比较懒也就用dfs刷过了。查找每一个可以挖的地雷,因为题目给出的邻接矩阵比较特殊所以不用标记重复的地雷,用一个数组l记录路径。手气很好一次过。

源代码/pas:

var
  n,max:Longint;
  a:array[1..21,1..21]of longint;
  l,r,v:array[0..21]of longint;
procedure dfs(x,y:longint);
var
  i:longint;
begin
  if y>max then
  begin
    max:=y;
    r:=l;
  end;
  for i:=1 to n do
  if a[x,i]=1 then
  begin
    l[x]:=i;
    dfs(i,y+v[i]);
    l[x]:=0;
  end;
end;
procedure init;
var
  i,j:longint;
begin
  readln(n);
  for i:=1 to n do read(v[i]);
  for i:=1 to n-1 do
  for j:=i+1 to n do
  read(a[i,j]);
  for i:=1 to n do
  begin
    l[0]:=i;
    dfs(i,v[i]);
    fillchar(l,sizeof(l),0);
  end;
end;
procedure print;
var
  i:longint;
begin
  i:=0;
  while r[i]<>0 do
  begin
    i:=r[i];
    write(i,' ');
  end;
  writeln;
  writeln(max);
end;
begin
  init;
  print;
end.


转载于:https://www.cnblogs.com/olahiuj/p/5781319.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值