CCF 201509 4 高速公路

2021-10-03 08:11:11 字數 1597 閱讀 9485

問題描述

某國有n個城市,為了使得城市間的交通更便利,該國國王打算在城市之間修一些高速公路,由於經費限制,國王打算第一階段先在部分城市之間修一些單向的高速公路。

現在,大臣們幫國王擬了乙個修高速公路的計畫。看了計畫後,國王發現,有些城市之間可以通過高速公路直接(不經過其他城市)或間接(經過乙個或多個其他城市)到達,而有的卻不能。如果城市a可以通過高速公路到達城市b,而且城市b也可以通過高速公路到達城市a,則這兩個城市被稱為便利城市對。

國王想知道,在大臣們給他的計畫中,有多少個便利城市對。

輸入格式

輸入的第一行包含兩個整數n, m,分別表示城市和單向高速公路的數量。

接下來m行,每行兩個整數a, b,表示城市a有一條單向的高速公路連向城市b。

輸出格式

輸出一行,包含乙個整數,表示便利城市對的數量。

樣例輸入

5 51 2

2 33 4

4 23 5

樣例輸出

3樣例說明

城市間的連線如圖所示。有3個便利城市對,它們分別是(2, 3), (2, 4), (3, 4),請注意(2, 3)和(3, 2)看成同乙個便利城市對。

評測用例規模與約定

前30%的評測用例滿足1 ≤ n ≤ 100, 1 ≤ m ≤ 1000;

前60%的評測用例滿足1 ≤ n ≤ 1000, 1 ≤ m ≤ 10000;

所有評測用例滿足1 ≤ n ≤ 10000, 1 ≤ m ≤ 100000。

輸入為乙個有向圖,求其中能夠相互到達的城市對。分解強連通分量即可,若乙個強連通分量中城市的個數為n,則該強連通分量內的便利城市對個數即n*(n-1)/2,累加後即所求答案。

強連通分量分解,可以用兩次簡單的dfs實現(kosaraju)。

#include

#include

#include

using

namespace std;

const

int max_v=

10007

;int n,m,vis[max_v]

;vector<

int> g[max_v]

,rg[max_v]

,vs;

void

dfs(

int u)

vs.push_back

(u);

}int

rdfs

(int u)

return x;

}int

main()

for(

int i=

1;i<=n;i++)if

(!vis[i]

)dfs

(i);

memset

(vis,0,

sizeof

(vis));

for(

int i=vs.

size()

-1;i>=

0;i--)}

cout

}

題解彙總

ccf-csp認證歷年題解

CCF 201509 4 高速公路

問題描述 試題編號 201509 4 試題名稱 高速公路 時間限制 1.0s 記憶體限制 256.0mb 問題描述 問題描述 某國有n個城市,為了使得城市間的交通更便利,該國國王打算在城市之間修一些高速公路,由於經費限制,國王打算第一階段先在部分城市之間修一些單向的高速公路。現在,大臣們幫國王擬了乙...

CCF 201509 4 高速公路(強連通分量)

求有多少個結點對能夠互相到達 思路一 50分 對每個結點dfs,求傳遞閉包,時間為o v e 簡單,但是超時 思路二 100分 計算圖的強連通分量 scc 各個分量裡面的點都是可以相互到達的 scc演算法 o v e 強連通分量 strongly connected components dfs求拓...

CCF201509 4 高速公路 強連通分量

傳送門 ccf201509 4 高速公路 tarjan強連通分量演算法的模板題。求得強連通分量後,包含的點為cnt個,其中的任意兩個城市都是便利城市對,數量為 include define ll long long define inf 0x3f3f3f3f using namespace std ...