Description
You are to write a program that computes the minimal number of schools that must receive a copy of the new software in order for the software to reach all schools in the network according to the agreement (Subtask A). As a further task, we want to ensure that by sending the copy of new software to an arbitrary school, this software will reach all schools in the network. To achieve this goal we may have to extend the lists of receivers by new members. Compute the minimal number of extensions that have to be made so that whatever school we send the new software to, it will reach all other schools (Subtask B). One extension means introducing one new member into the list of receivers of one school.
Input
Output
这题大意是给一个有向图,求至少给多少个结点发消息能使消息传遍整个网络,并进一步求出至少添加多少条边能使对图中任意一个结点发消息都能使消息传遍整个网络。这道题就是求学校之间连成网络的强联通分量。
(1).可以先用,得到原图的基图,然后统计入度为0的连通分量个数和出度为0的连通分量个数,入度为0的必须给它发消息,入度不为0的不必给发消息。
(2).第一问,所求即为图中入度为0的个数。
(3).第二问,只需将入度为0的结点与出度为0的结点连接即可满足要求,最少需加边数目为两者之中的较大者,需注意的是,单只有一个连通分量时,输出结果为0 。
procedure tarjan(i:longint);
var
j,t:longint;
begin
inc(s);
a[i]:=s;
b[i]:=s;
inc(temp);
sum[tot]:=i;
t:=ls[i];
while t>0 do
begin
j:=g[t].y;
if a[j]=0 then
begin
tarjan(j);
if b[i]>b[j] then
b[i]:=b[j];
end
else if flag[j] and (a[j]<b[i])
b[i]:=a[j];
end;
if a[i]=b[i] then
begin
inc(x);
repeat
j:=sum[temp];
dec(temp);
flag[j]:=false;
main[j]:=x;
until i=j;
end;
end;