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 |
Re:为啥我的程序能过啊?In Reply To:为啥我的程序能过啊? Posted by:Jj1729 at 2012-04-19 16:32:15 > 代码比较丑…… > > #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。 我输出的是0,但是是wa了 Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator