2013-11-16 11:39
原題傳送門 http://www.lydsy.com/JudgeOnline/problem.php?id=1051
強連通分量,縮完點之后看出度為0的強連通分量有幾個,如果只有一個則輸出該強連通分量的點數,否則輸出0;
/**************************************************************
Problem:
1051
User: BLADEVIL
Language: Pascal
Result: Accepted
Time:
124
ms
Memory:
1396
kb
****************************************************************/
//
By BLADEVIL
var
n, m :longint;
pre, other :
array
[
0
..
100010
]
of
longint;
last :
array
[
0
..
20010
]
of
longint;
l :longint;
flag :
array
[
0
..
10010
]
of
boolean;
dfn, low :
array
[
0
..
10010
]
of
longint;
time :longint;
tot :longint;
stack :
array
[
0
..
10010
]
of
longint;
key :
array
[
0
..
10010
]
of
longint;
size :
array
[
0
..
10010
]
of
longint;
full :longint;
father :
array
[
0
..
20010
]
of
longint;
function
min(a,b:longint):longint;
begin
if
a>b
then
min:=b
else
min:=
a;
end
;
procedure
connect(x,y:longint);
begin
inc(l);
pre[l]:
=
last[x];
last[x]:
=
l;
other[l]:
=
y;
end
;
procedure
init;
var
i :longint;
x, y :longint;
begin
read(n,m);
for
i:=
1
to
m
do
begin
read(x,y);
connect(y,x);
end
;
end
;
procedure
dfs(x:longint);
var
q, p :longint;
cur :longint;
begin
inc(time);
dfn[x]:
=
time;
low[x]:
=
time;
flag[x]:
=
true;
inc(tot);
stack[tot]:
=
x;
q:
=
last[x];
while
q<>
0
do
begin
p:
=
other[q];
if
dfn[p]=
0
then
begin
dfs(p);
low[x]:
=
min(low[x],low[p]);
end
else
if
flag[p]
then
low[x]:=
min(low[x],dfn[p]);
q:
=
pre[q];
end
;
cur:
=-
1
;
if
dfn[x]=low[x]
then
begin
while
cur<>x
do
begin
cur:
=
stack[tot];
dec(tot);
flag[cur]:
=
false;
key[cur]:
=x+
n;
inc(size[key[cur]]);
end
;
end
;
end
;
procedure
main;
var
i :longint;
q, p :longint;
begin
for
i:=
1
to
n
do
if
dfn[i]=
0
then
dfs(i);
for
i:=
1
to
n
do
begin
q:
=
last[i];
while
q<>
0
do
begin
p:
=
other[q];
if
key[i]<>key[p]
then
begin
connect(key[i],key[p]);
father[key[p]]:
=
key[i];
end
;
q:
=
pre[q];
end
;
end
;
full:
=-
1
;
for
i:=
1
to
n
do
begin
if
(father[key[i]]=
0
)
and
(full=-
1
)
then
full:=
key[i];
if
(father[key[i]]=
0
)
and
(full<>-
1
)
and
(full<>key[i])
then
begin
writeln(
0
);
exit;
end
;
end
;
writeln(size[full]);
end
;
begin
init;
main;
end
.
?
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061
微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元

