假如有命題p 一定能推出命題q,則稱p 是q 的充分條件,q 是p 的必要條件。
特別的,當p 既是q 的充分條件,又是q 的必要條件時,稱p 和q 互為充要條件
現在有n 個命題,其中一些是另一些的充分條件。請問有多少對命題互為充要條件?
第一行三個正整數n,m,分別表示命題數、已知關係數
接下來m 行,每行兩個正整數p 和q,表示命題p 是命題q 的充分條件
5 5
1 3
3 2
2 1
4 5
5 4僅一行,乙個整數,表示充要條件的對數
4 樣例說明:
4 對充要條件分別是(1, 2)、(2, 3)、(1, 3)、(4, 5)
對於10% 的資料,n <= 10;m <= 50
對於40% 的資料,n <= 500;m <= 1000
對於另外10% 的資料,資料中保證沒有重邊且m = n^2
對於100% 的資料,n<= 50000;m <= 600000
其實這個題就是讓我們找圖中的環,我們可以用tarjan的演算法,找到每個擁有的節點個數n,加上n(
n−1)
/2那麼講一下tarjan演算法:
tarjan演算法基於定理:在任何深度優先搜尋中,同一強連通分量內的所有頂點均在同一棵深度優先搜尋樹中。也就是說,強連通分量一定是有向圖的某個深搜樹子樹。
這樣,我們用low值記錄該點所在強連通子圖對應的搜尋子樹的根節點的dfn值。注意,該子樹中的元素在棧中一定是相鄰的,且根節點在棧中一定位於所有子樹元素的最下方。
強連通分量是由若干個環組成的。所以,當有環形成時(也就是搜尋的下乙個點已在棧中),我們將這一條路徑的low值統一,即這條路徑上的點屬於同乙個強連通分量。
如果遍歷完整個搜尋樹後某個點的dfn值等於low值,則它是該搜尋子樹的根。這時,它以上(包括它自己)一直到棧頂的所有元素組成乙個強連通分量。
var
i,j,n,m,tot,l,bz1,p,num:longint;
ans:int64;
tov,next,last:array[0..600000]of longint;//形成邊的鏈結陣列,詳見(spfa)
bz,zb:array[0..50000]of boolean;//bz為是否訪問,zb為是否在棧中
f,x,y,low,dfn:array[0..50000]of longint;//dfn為時間戳,low為祖先,f為棧
function
min(a,b:longint):longint;
begin
if a>b then
exit(b);
exit(a);
end;
procedure
tarjan
(x:longint);
//tarjan
var y,i,xx,v:longint;
begin
inc(num);
dfn[x]:=num;
low[x]:=num;
bz[x]:=true;
inc(p);
f[p]:=x;
i:=last[x];
zb[x]:=true;
while i<>0
dobegin
y:=tov[i];
if bz[y]=false
then
//未被訪問
begin
tarjan(y);
low[x]:=min(low[x],low[y]);
endelse
if zb[y] then
low[x]:=min(low[x],dfn[y]);
i:=next[i];
end;
if low[x]=dfn[x] then
//已經找到乙個強連通分量,彈棧。
begin
xx:=0;
repeat
v:=f[p];
zb[v]:=false;
dec(p);
inc(xx);
until x=v;
ans:=ans+xx*(xx-1) shr
1; end;
end;
procedure
insert
(x,y:longint);
begin
inc(tot);
tov[tot]:=y;
next[tot]:=last[x];
last[x]:=tot;
end;
begin
readln(n,m);
for i:=1
to m do
begin
readln(x[i],y[i]);
insert(x[i],y[i]);//形成連通圖
end;
tarjan(1);
for i:=1
to n do
if bz[i]=false
then
tarjan(i);
writeln(ans);
end.
測試埠聯通性
linux系統測試埠連通性的方法 有四種常用方法 1.telnet 方法 2.wget 方法 3.ssh 方法 4.curl 方法 下面一一介紹。1.telnet 用法 telnet ip port 1 連線不存在的埠 telnet 1.1.1.1 8 trying 1.1.1.1.telnet c...
風險度量 (判斷聯通性)
x星系的的防衛體系包含 n 個空間站。這 n 個空間站間有 m 條通訊鏈路,構成通訊網。兩個空間站間可能直接通訊,也可能通過其它空間站中轉。對於兩個站點x和y x y 如果能找到乙個站點z,使得 當z被破壞後,x和y無法通訊,則稱z為關於x,y的關鍵站點。顯然,對於給定的兩個站點,關於它們的關鍵點的...
例項的網路聯通性問題
9月8日更新 解釋及解決辦法 解釋 openstack中有兩種ip位址的概念 fixed ip和floating ip。fixed ip 是例項的真實ip,在建立例項時注入,如果作業系統不支援注入如windows,openstack會在例項啟動後通過dhcp方式把fixed ip分配給例項。floa...