桥边数量

 1 type edge=record
 2         nt,u,v:longint;
 3         end;
 4 const     maxn=100008;
 5       maxm=200008;
 6 var eg:array[0..maxm*2] of edge;
 7     lt:array[0..maxn] of longint;
 8     dfn,low,stack,cl:array[0..maxn] of longint;
 9     i,j,n,m,u,v,sum,num,k:longint;
10     tmp,now:longint;
11 procedure add(u,v:longint);
12 begin
13     inc(sum);
14     eg[sum].u:=u;
15     eg[sum].v:=v;
16     eg[sum].nt:=lt[u];
17     lt[u]:=sum;
18 end;
19 function min(a,b:longint):longint;
20 begin
21     if a<b then exit(a) else exit(b);
22 end;
23 procedure dfs(u,fa:longint);
24 var v,i:longint;
25 begin
26     inc(tmp); dfn[u]:=tmp; low[u]:=tmp;
27     inc(now); stack[now]:=u;
28     i:=lt[u];
29     while i<>-1 do
30     begin
31         v:=eg[i].v;
32         if v<>fa then
33             if dfn[v]=0 then
34             begin
35                 dfs(v,u);
36                 low[u]:=min(low[u],low[v]);
37             end
38             else low[u]:=min(low[u],dfn[v]);
39         i:=eg[i].nt;
40     end;
41     if dfn[u]=low[u] then
42     begin
43         inc(num);
44         while true do
45         begin
46             v:=stack[now];
47             cl[v]:=num;
48                         dec(now);
49             if u=v then break;
50         end;
51     end;
52 end;
53 begin
54     for i:=1 to maxn do lt[i]:=-1;
55     readln(n,m);
56     sum:=-1;
57     for i:=1 to m do
58     begin
59         readln(u,v);
60         add(u,v);
61         add(v,u);
62     end;
63     for i:=1 to n do
64         if dfn[i]=0 then
65             dfs(i,0);
66     for i:=1 to sum do
67         if odd(i) then
68         begin
69             if cl[eg[i].u]<>cl[eg[i].v] then inc(k);
70         end;
71        writeln(k);
72        //for i:=1 to n do write(cl[i],‘  ‘);
73 end.
时间: 2024-10-16 09:50:20

桥边数量的相关文章

hdu4612 无向图中任意添加一条边后使桥的数量最少 / 无向图缩点+求树的直径

题意如上,含有重边(重边的话,俩个点就可以构成了边双连通). 先缩点成树,在求数的直径,最远的连起来,剩下边(桥)的自然最少.这里学习了树的直径求法:第一次选任意起点U,进行bfs,到达最远的一个点v(level最深)该点必然是树的直径的一个端点,,再从该点出发,bfs,到最深的一点,该点深度就是直径.(证明:先假设u,是直径上一点,S,T是直径的端点,设v!=t,则有(V,U)+(U,S)>(T,U)+(U,S),矛盾,故t=v:若u不是直径上一点,设u到直径上的一点为x,同理易证. 最后 缩

ZOJ 2588 求桥的数量

点击打开链接 题意:将无向图中的桥找出来,并将他们的输入序号输出 思路:模版找桥,但是注意处理重边和后面的输出,别的没什么了,模版题 #include <vector> #include <stdio.h> #include <string.h> #include <stdlib.h> #include <iostream> #include <algorithm> using namespace std; typedef long

hdu4612 无向图中随意加入一条边后使桥的数量最少 / 无向图缩点+求树的直径

题意如上,含有重边(重边的话,俩个点就能够构成了边双连通). 先缩点成树,在求数的直径,最远的连起来,剩下边(桥)的自然最少.这里学习了树的直径求法:第一次选随意起点U,进行bfs,到达最远的一个点v(level最深)该点必定是树的直径的一个端点,,再从该点出发,bfs,到最深的一点.该点深度就是直径. (证明:先如果u.是直径上一点,S,T是直径的端点.设v!=t,则有(V,U)+(U,S)>(T,U)+(U,S),矛盾,故t=v:若u不是直径上一点.设u到直径上的一点为x.同理易证. 最后

[UVA796]Critical Links(割边, 桥)

题目链接:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=737 求桥的数量,也就是割边的数量.输入有点小坑,左右括号外必须得有个空格才行,起初以为是转义的问题. 1 /* 2 ━━━━━┒ギリギリ♂ eye! 3 ┓┏┓┏┓┃キリキリ♂ mind! 4 ┛┗┛┗┛┃\○/ 5 ┓┏┓┏┓┃ / 6 ┛┗┛┗┛┃ノ) 7 ┓┏┓┏┓┃ 8

HDU - 2460 Network(桥+LCA)

题目大意:给出一张图,现在要往这张图上加边,问加完边后,这张图还有多少条桥 解题思路:求出连通分量,压缩成点,用桥连接,形成了棵树 每次添加边时,就找一下是否在同一个强连通分量内,如果在同一个强连通分量内,那么桥的数量不变 反之,求出两个点的LCA,并且把LCA到这两个点的桥全部去掉(因为加边后,形成了环,构成了一个新的强连通分量了) #include <cstdio> #include <cstring> using namespace std; #pragma comment(

HDU 2460 Network(桥+LCA)

http://acm.hdu.edu.cn/showproblem.php?pid=2460 题意:给出图,求每次增加一条边后图中桥的数量. 思路: 先用tarjan算法找出图中所有的桥,如果lowv>pre[u],那么u—v就是桥,此时可以标记一下v. 之后就是利用LCA,找到两个节点的公共祖先,在这条路径上的桥就不再是桥了.(此时就相当于这些桥组成的树,可以在脑海中缩点) 1 #include<iostream> 2 #include<algorithm> 3 #incl

POJ3694 Network(Tarjan双联通分图 LCA 桥)

链接:http://poj.org/problem?id=3694 题意:给定一个有向连通图,每次增加一条边,求剩下的桥的数量. 思路: 给定一个无向连通图,添加一条u->v的边,求此边对图剩余的桥的数量的影响:     若u,v在同一个强联通分量中,则是否添加无影响.否则从u,v的LCA到u,v的边上所有的桥都不再是桥.     在Tarjan算法中,对在同一个强联通分量中的点使用并查集合并,实现缩点,同时记录父亲节点.若u,v属于不同的强连通分量,将dfn较大的点(设为v)向上合并直到dfn

hdu2460 poj3694 求桥 + 求lca

http://poj.org/problem?id=3694 题意: 给定一个图,对这个图进行加边,求出每加一条边后,图中桥的个数. 思路: 首先肯定是要先求出原图中桥的个数,并且把桥标记起来.思考加一条边以后桥的数量会减少多少,联想到之前的那道题,就是加一条边,能够使桥的数量最少是多少.之前那个做法就是缩点后树的直径,这个就是可以减少的最多的桥的数量.因为如果这是一条链,将两个端点连起来,这上面的桥都消失了.. 所以按照这个思路,可以考虑,对于每个要加的边,求出他们的lca,在这个路径上如果碰

hdoj 4612 Warm up【双连通分量求桥&amp;&amp;缩点建新图求树的直径】

Warm up Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65535/65535 K (Java/Others)Total Submission(s): 5093    Accepted Submission(s): 1131 Problem Description N planets are connected by M bidirectional channels that allow instant transport