您的位置:首页 > 其它

POJ 3177 Redundant Paths(Tarjan)

2013-04-16 19:52 381 查看
题目链接

看这个题解:http://blog.csdn.net/zhang20072844/article/details/8145588

对于Tarjan还是不太理解。

#include <iostream>
#include <cstring>
#include <cstdio>
#include <cstdlib>
using namespace std;
#define N 10001
#define M 50001
struct node
{
int u,v,next;
} edge[M+10];
int t,top,scnt;
int DFN[N+1],Low[N+1],first[N+1];
int cnt[N+1];
bool mat[5001][5001];
void CL()
{
t = 0;
t = scnt = top = 0;
memset(first,-1,sizeof(first));
memset(DFN,0,sizeof(DFN));
memset(mat,0,sizeof(mat));
}
void add(int u,int v)
{
edge[t].u = u;
edge[t].v = v;
edge[t].next = first[u];
first[u] = t ++;
}
void Tarjan(int u,int father)
{
int v,i;
DFN[u] = Low[u] = ++ t;
for(i = first[u]; i != -1; i = edge[i].next)
{
v = edge[i].v;
if(!DFN[v])
{
Tarjan(v,u);
if(Low[u] > Low[v])
{
Low[u] = Low[v];
}
}
else if(v != father&&Low[u] > DFN[v])
{
Low[u] = DFN[v];
}
}
}
int main()
{
int n,m,sv,ev,i,j,v,ans;
while(scanf("%d%d",&n,&m)!=EOF)
{
CL();
memset(cnt,0,sizeof(cnt));
for(i = 1; i <= m; i ++)
{
scanf("%d%d",&sv,&ev);
if(!mat[sv][ev])
{
add(sv,ev);
add(ev,sv);
mat[sv][ev] = mat[ev][sv] = true;
}
}
t = 0;
Tarjan(1,1);
for(i = 1;i <= n;i ++)
{
for(j = first[i];j != -1;j = edge[j].next)
{
v = edge[j].v;
if(Low[v] != Low[i])
cnt[Low[i]] ++;
}
}
ans = 0;
for(i = 1;i <= n;i ++)
{
if(cnt[i] == 1)
ans ++;
}
printf("%d\n",(ans+1)/2);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: