Online Judge | Problem Set | Authors | Online Contests | User | ||||||
---|---|---|---|---|---|---|---|---|---|---|
Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest |
为啥我的程序能过啊?代码比较丑…… #include <cstdio> #include <cstdlib> #include <algorithm> #include <string> const int maxN = 5010; struct Edge { int v; bool bridge; Edge *next, *back; Edge() {} Edge(int v, Edge *next): v(v), next(next), bridge(0) {} } *edge[maxN], *bridge[maxN]; bool marked[maxN]; int DFN[maxN], Low[maxN], stack[maxN]; int Belong[maxN], Degree[maxN]; int root, Dcnt, Ind, leaf, top, n, m; inline int getint() { int res = 0; char tmp; while (!isdigit(tmp = getchar())); do res = (res << 3) + (res << 1) + tmp - '0'; while (isdigit(tmp = getchar())); return res; } void tarjan(int u, int Last) { DFN[u] = Low[u] = ++Ind; marked[stack[++top] = u] = 1; for (Edge *p = edge[u]; p; p = p -> next) if (p -> v != Last) //这样每次判断不等于父亲好像在有重边的情况下要错 { int v = p -> v; if (!DFN[v]) { tarjan(v, u); Low[u] = std::min(Low[u], Low[v]); if (DFN[u] < Low[v]) { p -> back -> bridge = p -> bridge = 1; //标记为桥。 ++Dcnt; int tmp = v; do { tmp = stack[top--]; marked[tmp] = 0; Belong[tmp] = Dcnt; } while (tmp - v); } } else if (marked[v]) Low[u] = std::min(Low[u], DFN[v]); } return; } int main() { freopen("Redundant_Paths.in", "r", stdin); freopen("Redundant_Paths.out", "w", stdout); n = getint(); m = getint(); while (m--) { int u = getint(), v = getint(); edge[u] = new Edge(v, edge[u]); edge[v] = new Edge(u, edge[v]); edge[u] -> back = edge[v]; edge[v] -> back = edge[u]; } tarjan(1, -1); int tmp = 1; ++Dcnt; do { tmp = stack[top--]; marked[tmp] = 0; Belong[tmp] = Dcnt; } while (tmp - 1); //最后把根所在的双联通分量取出来。 for (int u = 1; u < n + 1; ++u) for (Edge *p = edge[u]; p; p = p -> next) if (p -> bridge) //这句要是改成if (Belong[u]!=Belong[p->v])就WA了…… { int v = p -> v; bridge[Belong[u]] = new Edge(Belong[v], bridge[Belong[u]]); } int leaf = 0; for (int u = 1; u < Dcnt + 1; ++u) { for (Edge *p = bridge[u]; p; p = p -> next) ++Degree[u]; if (Degree[u] == 1) ++leaf; } printf("%d\n", leaf == 1 ? 0 : (leaf + 1 >> 1)); return 0; } 比如这组数据: 5 23 1 2 5 4 4 1 4 3 5 3 1 5 4 1 3 1 3 1 1 3 4 5 1 2 4 5 3 5 4 5 1 4 3 5 4 5 5 1 4 5 2 1 1 4 5 4 正确答案是0,但我的程序输出1。 Followed by:
Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator