HNU 11877

http://acm.hnu.cn/online/?action=problem&type=show&id=11877 无向图的双连通

题意: 求无向图的最大环, 并且途中每个点最多只属于一个环中。

 

算法分析: 每个点最多只属于一个环,那有一点我们就得注意:如果点很多之间是双连通的,那么这些点必定在一个环中。 我们只需求出这些环环边数即可。。

需要注意的是: 此题若没有环 不是输出1 ,而是输出0 这里wa了好几次。。。。

代码:

#include #include using namespace std ; #define N 5000 vectormap[N] ; struct Node { int u, v ; }e, stack[N]; int n, m, nc, top, ret ; int dfn[N], low[N] ; void dfnlow(int u, int f) { dfn[u] = low[u] = nc ++ ; for(int i = 0 ; i < map[u].size() ; i ++) { int v = map[u][i] ; if(v!=f && dfn[v] < dfn[u]) { /* 避免回退边 */ stack[top].u = u ; stack[top].v = v ; ++top ; if(dfn[v] < 0) { dfnlow(v, u) ; low[u] = min(low[u], low[v]); if(low[v] >= dfn[u]) { int nt = 0 ; do{ e = stack[--top]; nt ++ ; }while( !(e.u == u && e.v == v)) ; ret = max(ret, nt) ; } }else if (v != f) low[u] = min(low[u], dfn[v]) ; } } } int main() { int ncas ; scanf("%d", &ncas) ; while(ncas--) { scanf("%d%d", &n, &m) ; int a, b ; for(int i = 1 ; i<= n ; i ++) map[i].clear() ; for(int i = 0 ; i < m ; i ++) { scanf("%d%d", &a, &b) ; map[a].push_back(b), map[b].push_back(a) ; } nc = 1 , top = 0, ret = 0 ; memset(dfn, -1, sizeof(dfn)) ; dfnlow(1, -1) ; if(ret > 1)printf("%d/n", ret) ; else puts("0") ; } return 0 ; }

 

你可能感兴趣的:(图论,vector,struct,算法)