强连通分量的应用,枚举每两个点(枚举第二个点可以在递归中完成)
#include <cstdio> #include <iostream> #include <vector> #include <bitset> #include <algorithm> using namespace std; const int MAXN = 5005; int head[MAXN], ee; int n, m, res; int dfn[MAXN], low[MAXN], df, mdel, mt[MAXN]; struct _edge { int v, next; }edge[MAXN<<1]; void add(int u, int v) { edge[ee].v = v; edge[ee].next = head[u]; head[u] = ee++; } void dfs(int u, int pre) { int cnt = 0; dfn[u] = low[u] = ++df; for (int i = head[u]; ~i; i=edge[i].next) { int v = edge[i].v; if (mdel == v || v == pre) continue; if (dfn[v]) { low[u] = min(low[u], low[v]); } else { dfs(v, u); low[u] = min(low[u], low[v]); if (low[v] >= dfn[u]) { ++cnt; } } } if (pre == -1) { --cnt; } mt[u] = cnt; } int main() { #ifndef ONLINE_JUDGE freopen("in.txt", "r", stdin); #endif while (scanf("%d%d", &n, &m) != EOF) { memset(head, -1, sizeof head); ee = 0; for (int i = 0; i < m; ++i) { int u, v; scanf("%d%d", &u, &v); add(u, v); add(v, u); } res = -1; int sum = 0; for (int i = 0; i< n; ++i) { mdel = i; sum = 0; memset(dfn, 0, sizeof dfn); df = 1; for (int j = 0; j< n; ++j) { if (mdel == j || dfn[j]) continue; sum ++; dfs(j, -1); } for (int j = 0; j< n; ++j) { if (mdel == j) continue; res = max(res, mt[j]+sum); } } printf("%d\n", res); } return 0; }
hdu 4587 TWO NODES(强连通分量)
最新推荐文章于 2020-08-28 18:30:51 发布