算法: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.