poj 1523 求图的割点
2013-12-14 20:03
381 查看
这是一个求割点的题目 ,
要注意两点:
1、所有点不一定是连续的
2、每组数据要输出一个换行
求分成几个连通分量 , 就等于是割点有几颗子树(子树中回边的lowv 比 割点的 low[u]大)+ 1 , 但是根结点例外 ,
不需要+1;
代码:
#include
#include
#include
#include
#include
#include
using namespace std;
const int MAXN = 1010 ;
vectorgrap[MAXN*2] ;
int pre[MAXN] , low[MAXN] , iscnt[MAXN] ;
int dfs_clock , n = 0;
void init()
{
for(int i =
1 ; i <= n ; i++)
grap[i].clear();
memset(pre,
0 , sizeof(pre));
memset(iscnt
, 0 , sizeof(iscnt));
dfs_clock =
0;
}
int dfs(int u , int fa)
{
int lowu =
pre[u] = ++dfs_clock;
int child =
0;
for(int i =
0 ; i < grap[u].size() ; i++)
{
int v =
grap[u][i];
if(!pre[v])
{
child++;
int lowv =
dfs(v , u);
if(lowv
< lowu) lowu = lowv;
if(lowv
>= pre[u])
iscnt[u] +=
1;
}
else
if(pre[v] < pre[u]
&& v != fa)
{
if(pre[v]
< lowu) lowu = pre[v];
}
}
if(fa
< 0) iscnt[u] -= 1;
low[u] =
lowu;
return
lowu;
}
int main()
{
int xy =
1;
while(1)
{
init();
int i , x ,
y;
n = 0;
int
gh[MAXN];
memset(gh ,
0 , sizeof(gh));
for(i = 0; ;
i++)
{
scanf("%d" ,
&x);
if(x == 0
&& i ==0) return
0;
else if(x ==
0) break;
scanf("%d" ,
&y);
grap[x].push_back(y);
grap[y].push_back(x);
要注意两点:
1、所有点不一定是连续的
2、每组数据要输出一个换行
求分成几个连通分量 , 就等于是割点有几颗子树(子树中回边的lowv 比 割点的 low[u]大)+ 1 , 但是根结点例外 ,
不需要+1;
代码:
#include
#include
#include
#include
#include
#include
using namespace std;
const int MAXN = 1010 ;
vectorgrap[MAXN*2] ;
int pre[MAXN] , low[MAXN] , iscnt[MAXN] ;
int dfs_clock , n = 0;
void init()
{
for(int i =
1 ; i <= n ; i++)
grap[i].clear();
memset(pre,
0 , sizeof(pre));
memset(iscnt
, 0 , sizeof(iscnt));
dfs_clock =
0;
}
int dfs(int u , int fa)
{
int lowu =
pre[u] = ++dfs_clock;
int child =
0;
for(int i =
0 ; i < grap[u].size() ; i++)
{
int v =
grap[u][i];
if(!pre[v])
{
child++;
int lowv =
dfs(v , u);
if(lowv
< lowu) lowu = lowv;
if(lowv
>= pre[u])
iscnt[u] +=
1;
}
else
if(pre[v] < pre[u]
&& v != fa)
{
if(pre[v]
< lowu) lowu = pre[v];
}
}
if(fa
< 0) iscnt[u] -= 1;
low[u] =
lowu;
return
lowu;
}
int main()
{
int xy =
1;
while(1)
{
init();
int i , x ,
y;
n = 0;
int
gh[MAXN];
memset(gh ,
0 , sizeof(gh));
for(i = 0; ;
i++)
{
scanf("%d" ,
&x);
if(x == 0
&& i ==0) return
0;
else if(x ==
0) break;
scanf("%d" ,
&y);
grap[x].push_back(y);
grap[y].push_back(x);
相关文章推荐
- uva 10972 边—双连通分量
- 强连通分量scc
- uva 10765(无向双连通量)
- FZU 2103 组合概率
- 我的博客今天0岁51天了,我领取了…
- poj 1325
- uva 11865 stream my contest
- uva 11865 stream my contest
- 二分图的最佳完美匹配(和一些变形…
- 有向图最小生成树——最小树形图(朱…
- 每个点与点之间的瓶颈路
- LA 5713 Qin&nbsp…
- uva 11354 Bond
- 最小生成树的一些性质和理解
- poj 2485 简单的最小生…
- 我的博客今天0岁42天了,我领取了…
- LA 4080 Warfare A…
- hdu 2433 最短路树
- 【快速】排序, T(n) = O(nlgn),O(n^2) S(n) = O(lgn) --- 不稳定
- (C# 基础) 类访问修饰符