您的位置:首页 > 编程语言

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

2012-11-04 13:15 447 查看
#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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐