poj3352-参考3177,同样代码,直接通过

来源:互联网 发布:甜蜜蜜知乎 编辑:程序博客网 时间:2024/06/12 00:05
#include <stdio.h>#include <stdlib.h>#include <string.h>#define nMax 5005#define Min(a,b) (a<b?a:b)struct EDGE{int v,next;}edge[2 * nMax];int preEdge[nMax];int N, edgeNum, index;bool map[nMax][nMax];int dfn[nMax],low[nMax];void addEdge(int u, int v){edge[edgeNum].v = v;edge[edgeNum].next = preEdge[u];preEdge[u] = edgeNum ++;}void tarjan(int u, int father){dfn[u] = low[u] = ++ index;for (int i = preEdge[u]; i != -1; i = edge[i].next){int v = edge[i].v;if (!dfn[v]){tarjan(v, u);low[u] = Min(low[u], low[v]);}else if (v != father){low[u] = Min(low[u], dfn[v]);}}}void output(){int cnt[nMax], num = 0;memset(cnt, 0, sizeof(cnt));for (int i = 1; i <= N; ++ i){for (int j = preEdge[i]; j != -1; j = edge[j].next){int v = edge[j].v;if (low[v] != low[i]){cnt[low[i]] ++;}}}for (int i = 0; i <= N; ++ i){if (cnt[i] == 1){num ++;}}printf("%d\n", (num + 1) / 2);}int main(){int R,u,v;while (scanf("%d %d", &N, &R) != EOF){index = edgeNum = 0;memset(preEdge, -1, sizeof(preEdge));memset(map, false, sizeof(map));memset(dfn, 0, sizeof(dfn));for (int i = 0; i < R; ++ i){scanf("%d %d", &u, &v);if (!map[u][v]){addEdge(u,v);addEdge(v,u);map[u][v] = map[v][u] = true;}}tarjan(1, 1);output();}return 0;}

原创粉丝点击