hdu 4587 TWO NODES(强连通分量)

来源:互联网 发布:淘宝卖家注册流程 编辑:程序博客网 时间:2024/06/07 00:51

强连通分量的应用,枚举每两个点(枚举第二个点可以在递归中完成)

#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);#endifwhile (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;}


0 0
原创粉丝点击