『模板』極大強連通分量

題目來源

高速公路

AC代碼

#include<bits/stdc++.h>
using namespace std;
const int maxn = 1e4+10;
stack<int> s;
vector<int> g[maxn];
int low[maxn];
int dfn[maxn];
bool vis[maxn];
bool instack[maxn];
int n,m,t;
int ans = 0;
void tarjan(int u){
	dfn[u] = low[u] = ++t;
	vis[u] = 1;  
	s.push(u);
	instack[u] = 1;
	for(int i = 0; i < g[u].size(); i++){
		int v = g[u][i];
		if(vis[v]==0){
			tarjan(v);
			low[u] = min(low[u],low[v]);
		}else if(instack[v]){
			low[u] = min(low[u],low[v]);
		}
	}
	int m;
	int num = 0;
	if(dfn[u]==low[u]){
		do{
			num++;
			m = s.top();
			s.pop();
			instack[m] = 0;
		}while(m!=u);
	}
    if(num>1){
    	ans += num*(num-1)/2;
    }
}
int main(void){
	cin >> n >> m;
	for(int i = 1; i <= m; i++){
		int u,v;
		cin >> u >> v;
		g[u].push_back(v);
	}
	for(int i = 1; i <= n; i++){
		if(vis[i]==0){
			vis[i] = 1;
			tarjan(i);
		}
	}
	cout<<ans<<endl;
	return 0;
} 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章