思路:tarjan算法求強連通分量
AC代碼:
#include #include #include #include #include #include #include #include #include #include #include #include #include #include #define LL long long #define INF 0x7fffffff using namespace std; const int maxn = 10005; int n, m; vector mp[maxn]; int dfn[maxn]; int low[maxn]; int vis[maxn]; int in_stack[maxn]; int index; int color[maxn]; int col; bool color_is_ok[maxn]; stack s; int sum; void tarjan(int u) {//tarjan求強連通分量 dfn[u] = low[u] = ++ index; s.push(u); in_stack[u] = 1; vis[u] = 1; sum ++; int d = mp[u].size(); for(int i = 0; i < d; i ++) { int v = mp[u][i]; if(!vis[v]) { tarjan(v); low[u] = min(low[u], low[v]); } else if(in_stack[v]) { low[u] = min(low[u], dfn[v]); } } if(dfn[u] == low[u]) {//每求到一個強連通分量然後將這個強連通分量染色 int v; do { v = s.top(); s.pop(); in_stack[v] = 0; color[v] = col; } while(u != v); col ++;//為了區分每個強連通分量 } } int main() { while(scanf(%d %d, &n, &m) != EOF) { for(int i = 0; i <= n; i ++) { mp[i].clear(); } int u, v; for(int i = 0; i < m; i ++) { scanf(%d %d, &u, &v); mp[u].push_back(v); } memset(vis, 0, sizeof(vis)); memset(in_stack, 0, sizeof(in_stack)); memset(color, 0, sizeof(color)); index = 0; col = 1; sum = 0; for(int i = 1; i <= n; i ++) { if(!vis[i]) tarjan(i); } // cout << sum << endl; if(sum != n) { printf(0 ); continue; } // for(int i = 1; i <= n; i ++) cout << color[i] << ; // cout << endl; //標記有多少個縮點後出度為0的強連通分量 memset(color_is_ok, true, sizeof(color_is_ok)); for(int i = 1; i <= n; i ++) { int d = mp[i].size(); for(int j = 0; j < d; j ++) { if(color[mp[i][j]] != color[i]) { color_is_ok[color[i]] = false; break; } } } // for(int i = 1; i < col; i ++) { // cout << color_is_ok[i] << ; // } // cout << endl; int ans_col; int cnt = 0; for(int i = 1; i < col; i ++) { if(color_is_ok[i]) { ans_col = i; cnt ++; } } if(cnt == 1) {//當且僅當只有一個強連通分量構成的縮點出度為0時有答案 int ans = 0; for(int i = 1; i <= n; i ++) { if(color[i] == ans_col) { ans ++; } } printf(%d , ans); } else { printf(0 ); } } return 0; }
多線程公用對象釋放,多線程公用對象同樣是在一個面試中被問及在
C++入門學習——模板 為什麼需要模板? 我們已經學過重
Qt 窗體間傳值(代碼備份),qt窗體 剛開始看的時候看的
在文件夾中 的指定類型文件中 查找字符串(CodeBl
[LeetCode]Largest Number
nyoj936螞蟻的難題(X) 螞蟻的難題(X) 時間限