Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65535/65535 K (Java/Others)
Total Submission(s): 5353 Accepted Submission(s): 1195
#include <iostream> #include <cstdio> #include <cstring> #include <algorithm> #include <cmath> #include <queue> #include <stack> using namespace std; #define mem(a) memset(a, 0, sizeof(a)) #define mem1(a) memset(a, -1, sizeof(a)) #define mem2(a) memset(a, 0x3f, sizeof(a)) #define fi first #define se second typedef pair<int, int> pll; const int inf = 1061109567; const int maxn = 2e5+5; const int maxe = 1e6+5; int head[maxn], head1[maxn], dis[maxn], num, num1, top, cnum, instack[maxn], st[maxn], dfn[maxn], low[maxn], s[maxn]; int maxx, pos, vis[maxe*2], cnt; struct node { int to, nextt; }e[maxe*2], e1[maxe*2]; void add(int u, int v) { e[num].to = v, e[num].nextt = head[u], head[u] = num++; } void add1(int u, int v) { e1[num1].to = v, e1[num1].nextt = head1[u], head1[u] = num1++; } void init() { num = num1 = cnt = cnum = top = 0; mem1(head); mem(s); mem(vis); mem1(head1); mem(instack); mem(st); mem(dfn); mem(low); mem(dis); } pll edge[maxe]; void tarjan(int u) { instack[u] = 1; st[top++] = u; dfn[u] = low[u] = ++cnt; for(int i = head[u]; ~i; i = e[i].nextt) { int v = e[i].to; if(vis[i]) continue; vis[i] = vis[i^1] = 1; if(!dfn[v]) { tarjan(v); low[u] = min(low[u], low[v]); } else if(instack[v]) { low[u] = min(low[u], dfn[v]); } } if(low[u] == dfn[u]) { ++cnum; int x; do { x = st[--top]; instack[x] = 0; s[x] = cnum; } while(x != u); } } void bfs(int u) { queue <int> q; q.push(u); mem2(dis); dis[u] = 0; mem(vis); vis[u] = 1; maxx = 0, pos = u; while(!q.empty()) { int v = q.front(); q.pop(); for(int i = head1[v]; ~i; i = e1[i].nextt) { int ve = e1[i].to; if(vis[ve]) continue; vis[ve] = 1; dis[ve] = dis[v]+1; if(dis[ve]>maxx) { maxx = dis[ve]; pos = ve; } q.push(ve); } } } int main() { int n, m, x, y; while(cin>>n>>m) { if(n+m==0) break; init(); for(int i = 0; i<m; i++) { scanf("%d%d", &x, &y); edge[i].fi = x, edge[i].se = y; add(x, y); add(y, x); } tarjan(1); int edgenum = 0; for(int i = 0; i<m; i++) { int x = edge[i].fi, y = edge[i].se; if(s[x]!=s[y]) { add1(s[x], s[y]); add1(s[y], s[x]); edgenum++; } } bfs(s[1]); bfs(pos); int ans = edgenum-maxx; printf("%d\n", ans); } return 0; }
原文:http://www.cnblogs.com/yohaha/p/5232460.html