ccf 高速公路 100

2021-09-02 19:55:19 字數 1569 閱讀 9590

試題編號:

201509-4

試題名稱:

高速公路

時間限制:

1.0s

記憶體限制:

256.0mb

問題描述:

問題描述

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

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

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

輸入格式

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

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

輸出格式

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

樣例輸入

5 51 2

2 33 4

4 23 5

樣例輸出

樣例說明

城市間的連線如圖所示。有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。

終於寫完這道題啦~

我之前一直就覺得這道題好可怕。用了乙個dfs之前得了60,然後仔細一下,這不就是求連通分支嘛!

每個連通分支內要結對,就用乙個公式c(2,n),就可以了,即n*(n-1)/2

然後去網上查了一下連通分支的演算法,看到了tarjan演算法,下意思讀成太監了哈哈哈。

然後就成功了。

#include #include #define maxn 10005

using namespace std;

vectorv[maxn];//點

int low[maxn];

int dfn[maxn];

bool instack[maxn];//是否在棧中

int time;//時間戳

int answer = 0;

int stack[maxn];

int top;//棧頂

void tarjan(int i)

solve(n);

cout網上有很多tarjan的解釋部落格,最讓我困惑的是:

為什麼?

ccf 高速公路

問題描述 某國有n個城市,為了使得城市間的交通更便利,該國國王打算在城市之間修一些高速公路,由於經費限制,國王打算第一階段先在部分城市之間修一些單向的高速公路。現在,大臣們幫國王擬了乙個修高速公路的計畫。看了計畫後,國王發現,有些城市之間可以通過高速公路直接 不經過其他城市 或間接 經過乙個或多個其...

CCF高速公路

新學了tarjan演算法,今天中午之前還沒聽過,用dfs硬寫加了點優化得了70,對路的演算法還是給力,直接滿分。回頭整理一篇關於強連通分量的部落格,另外這次往後就慢慢全用c 了。include include include include define maxsize 10005 using na...

CCF 2015 9 4 高速公路 100分

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