1. 程式人生 > >The Largest Clique UVA - 11324( 強連通分量 + dp最長路)

The Largest Clique UVA - 11324( 強連通分量 + dp最長路)

強連通分量 top 起點 printf push fin clas int clu

技術分享圖片

這題 我剛開始想的是 縮點後 求出入度和出度為0 的點 然後統計個數 用總個數 減去

然而 這樣是不可以的 畫個圖就明白了。。。

技術分享圖片

如果 減去度為0的點 那麽最後如果出現這樣的情況是不可以的

因為 1中的點 和 3 中的點不通。。

#include <iostream>
#include <cstdio>
#include <sstream>
#include <cstring>
#include <map>
#include <set>
#include <vector>
#include 
<stack> #include <queue> #include <algorithm> #include <cmath> #define rap(a, n) for(int i=a; i<=n; i++) #define MOD 2018 #define LL long long #define ULL unsigned long long #define Pair pair<int, int> #define mem(a, b) memset(a, b, sizeof(a)) #define _ ios_base::sync_with_stdio(0),cin.tie(0) //
freopen("1.txt", "r", stdin); using namespace std; const int maxn = 1010, INF = 0x7fffffff; vector<int> G[50010]; int pre[maxn], low[maxn], sccno[maxn], dfs_clock, scc_cnt; int w[maxn], line[maxn][maxn], d[maxn]; stack<int> s; void dfs(int u) { pre[u] = low[u] = ++dfs_clock; s.push(u);
for(int i=0; i<G[u].size(); i++) { int v = G[u][i]; if(!pre[v]) { dfs(v); low[u] = min(low[u], low[v]); } else if(!sccno[v]) low[u] = min(low[u], pre[v]); } if(low[u] == pre[u]) { scc_cnt++; for(;;) { int x = s.top(); s.pop(); sccno[x] = scc_cnt; if(x == u) break; } } } void init() { dfs_clock = scc_cnt = 0; mem(sccno, 0); mem(pre, 0); mem(w, 0); mem(d, -1); mem(line, 0); for(int i=0; i<maxn; i++) G[i].clear(); } int dp(int u) { int& ans = d[u]; if(ans >= 0) return ans; ans = w[u]; //最後一個點後邊就沒有點了 for(int i=1; i<=scc_cnt; i++) if(u != i && line[u][i]) ans = max(ans, dp(i) + w[u]); return ans; } int main() { int T; scanf("%d", &T); while(T--) { init(); int n, m; scanf("%d%d", &n, &m); for(int i=1; i<=m; i++) { int u, v; scanf("%d%d", &u, &v); G[u].push_back(v); } for(int i=1; i<=n; i++) if(!pre[i]) dfs(i); for(int i=1; i<=n; i++) { w[sccno[i]]++; //統計每個強連通分量裏的點的個數 for(int j=0; j<G[i].size(); j++) line[sccno[i]][sccno[G[i][j]]] = 1; } int res = 0; for(int i=1; i<=scc_cnt; i++) // 以每一個點為起點 去找最長路 res = max(res, dp(i)); printf("%d\n", res); } return 0; }

The Largest Clique UVA - 11324( 強連通分量 + dp最長路)