Controlling Companies (concom)[USACO 2.3.5]

算法:DFS

分析:基本上相当于一道裸的DFS题了,连边,注意此图是有向图,因此只能连一条边。最后枚举每个点求能控制的公司。

{
ID:1011mashuo
PROG:concom
LANG:PASCAL
}
program concom;

const
 maxn=100;

var
 n,x,y,dis,maxp:longint;
 val:array [0..maxn] of longint;
 b,bb:array [0..maxn] of boolean;
 d:array [0..maxn,0..maxn] of longint;
 
function max(x,y:longint):longint;
begin
 if x>y then exit(x) else exit(y);
end;
 
procedure init;
var
 i:longint;
begin
 readln(n);
 for i:=1 to n do
  begin
   readln(x,y,dis);
   maxp:=max(y,maxp);
   maxp:=max(x,maxp);
   d[x,y]:=dis;
  end;
end;

procedure dfs(x:longint);{以x点为原点找能控制的公司。}
var
 i:longint;
begin
 if b[x] then exit;
 b[x]:=true;
 for i:=1 to maxp do
  begin
   inc(val[i],d[x,i]);
   if val[i]>50 then
    begin
     bb[i]:=true;
     dfs(i);
    end;
  end;
end;

procedure main;
var
 i,j:longint;
begin
 for i:=1 to maxp do
  begin
   fillchar(val,sizeof(val),0);{val表示每个点的临时被控制量。}
   fillchar(b,sizeof(b),false);{表示每个点是否被访问过。}
   fillchar(bb,sizeof(bb),false);{表示已i为原点能否控制这个公司。}
   bb[i]:=true;{原点初始化。}
   dfs(i);
   for j:=1 to maxp do if (i<>j) and (bb[j]) then writeln(i,' ',j);{如果j点可以控制就输出。}
  end;
end;

begin
 assign(input,'concom.in'); reset(input);
 assign(output,'concom.out'); rewrite(output);

 init;
 main;

 close(input); close(output);
end.


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值