求有多少個結點對能夠互相到達
思路一【50分】:對每個結點dfs,求傳遞閉包,時間為o(v*e),**簡單,但是超時思路二【100分】:計算圖的強連通分量(scc),各個分量裡面的點都是可以相互到達的
scc演算法:o(v+e)
強連通分量(strongly connected components)
①dfs求拓撲序(按u.f公升序排列)
②將圖轉置,按拓撲序的逆序dfs,得到的就是scc
#include #include #include #include #include #include #define endl "\n"
using namespace std;
vectortopo;
vector> adj,tmp;
int n,m,a,b;
bool vis[10005];
vectorcnt; //各個scc的結點個數
void dfs1(int x)
} topo.push_back(x); //完成搜尋,即結點變為黑色時,加入拓撲序
}void dfs2(int x) }}
inline int compute(int a) //組合數c(n, 2)
int main()
memset(vis,0,sizeof(vis)); //第一次dfs,記錄"拓撲序"
for(int i=1; i<=n; ++i) }
memset(vis,0,sizeof(vis)); //第二次dfs,求scc
for(int i=n-1; i>=0; --i) }
int sum = 0;
for(int i=0; isum += compute(cnt[i]);
cout
}
CCF 201509 4 高速公路
問題描述 試題編號 201509 4 試題名稱 高速公路 時間限制 1.0s 記憶體限制 256.0mb 問題描述 問題描述 某國有n個城市,為了使得城市間的交通更便利,該國國王打算在城市之間修一些高速公路,由於經費限制,國王打算第一階段先在部分城市之間修一些單向的高速公路。現在,大臣們幫國王擬了乙...
CCF 201509 4 高速公路
問題描述 某國有n個城市,為了使得城市間的交通更便利,該國國王打算在城市之間修一些高速公路,由於經費限制,國王打算第一階段先在部分城市之間修一些單向的高速公路。現在,大臣們幫國王擬了乙個修高速公路的計畫。看了計畫後,國王發現,有些城市之間可以通過高速公路直接 不經過其他城市 或間接 經過乙個或多個其...
CCF201509 4 高速公路 強連通分量
傳送門 ccf201509 4 高速公路 tarjan強連通分量演算法的模板題。求得強連通分量後,包含的點為cnt個,其中的任意兩個城市都是便利城市對,數量為 include define ll long long define inf 0x3f3f3f3f using namespace std ...