求桥,割点(HihoCoder - 1183 )

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;

struct my{
   int v;
   int next;
};
struct dage{
  int u;
  int v;
};

dage gebian[1000000*2+10];
int topbian;
bool  iscut[200000+10];
int adj[200000+10];
my bian[2000000+10];
int  pre[200000+10];
int dfsnum;
int n,m,fa;

void myinsert(int u,int v){
     bian[++fa].v=v;
     bian[fa].next=adj[u];;
     adj[u]=fa;
}

bool cmp(const dage &x,const dage &y){
     if(x.u==y.u) return x.v<=y.v;
     else return x.u<=y.u;
}
int tarjan(int u,int fa1){
    int lowu=pre[u]=++dfsnum;
    int child=0;
    for (int i=adj[u];i!=-1;i=bian[i].next){
        int v=bian[i].v;
        if(!pre[v]){
        child++;
        int lowv=tarjan(v,u);
        lowu=min(lowv,lowu);
        if(lowv>pre[u]){
                if(u<v){
            gebian[++topbian].u=u;
            gebian[topbian].v=v;
                }
            else {
                gebian[++topbian].u=v;
            gebian[topbian].v=u;
            }
        }
        if(lowv>=pre[u]){
            iscut[u]=true;
          }
        }
        else if(pre[v]<pre[u]&&v!=fa1){
            lowu=min(pre[v],lowu);
        }
    }
    if(fa1<0&&child==1) iscut[u]=false;
    return lowu;
}
int main(){
   memset(adj,-1,sizeof(adj));
   memset(bian,-1,sizeof(bian));
   scanf("%d%d",&n,&m);
   int u,v;
   for (int i=1;i<=m;i++){
    scanf("%d%d",&u,&v);
    myinsert(u,v);
    myinsert(v,u);
   }
   tarjan(1,-1);
   int sum=0;
 for (int i=1;i<=n;i++)
    if(iscut[i]) {
            sum++;
            printf("%d ",i);
    }
    //printf("\n");
  if(sum==0) printf("Null\n");
  else printf("\n");
   sort(gebian+1,gebian+1+topbian,cmp);
   for (int i=1;i<=topbian;i++) {
        printf("%d %d\n",gebian[i].u,gebian[i].v);
   }
return 0;
}

原文地址:https://www.cnblogs.com/lmjer/p/8195498.html

时间: 2024-10-03 22:55:14

求桥,割点(HihoCoder - 1183 )的相关文章

Tarjan求桥和割点

//Tarjan 求桥和割点 Tarjan(u,fa) { DFN[u]=LoW[u]=++time; Cu=grey; for each e=(u,v) { Tarjan(v,u); if(Cv=white) { low[u]=min(low[u],low[v]); }else { low[u]=min(low[u],DFN[v]); } } }

Tarjan求无向图割点、桥详解

tarjan算法--求无向图的割点和桥 一.基本概念 1.桥:是存在于无向图中的这样的一条边,如果去掉这一条边,那么整张无向图会分为两部分,这样的一条边称为桥无向连通图中,如果删除某边后,图变成不连通,则称该边为桥. 2.割点:无向连通图中,如果删除某点后,图变成不连通,则称该点为割点. 二:tarjan算法在求桥和割点中的应用 1.割点:1)当前节点为树根的时候,条件是"要有多余一棵子树"(如果这有一颗子树,去掉这个点也没有影响,如果有两颗子树,去掉这点,两颗子树就不连通了.) 2)

Tarjan求强连通分量、求桥和割点模板

Tarjan 求强连通分量模板.参考博客 #include<stdio.h> #include<stack> #include<algorithm> using namespace std; const int maxn = 1e3 + 10; const int maxm = 330000 + 10; struct EDGE{ int v, nxt; }Edge[maxm]; int Head[maxn], cnt; int DFN[maxn], LOW[maxn],

UVA 796 - Critical Links【求桥】

link:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=737 题意: 求桥的数目及边,要求输出边的点的次序由小到大 代码: #include <stdio.h> #include <ctime> #include <math.h> #include <limits.h> #include

tarjan求割边割点

tarjan求割边割点 内容及代码来自http://m.blog.csdn.net/article/details?id=51984469 割边:在连通图中,删除了连通图的某条边后,图不再连通.这样的边被称为割边,也叫做桥.割点:在连通图中,删除了连通图的某个点以及与这个点相连的边后,图不再连通.这样的点被称为割点.DFS搜索树:用DFS对图进行遍历时,按照遍历次序的不同,我们可以得到一棵DFS搜索树. 树边:在搜索树中的蓝色线所示,可理解为在DFS过程中访问未访问节点时所经过的边,也称为父子边

tarjan求桥、割顶

若low[v]>dfn[u],则(u,v)为割边.但是实际处理时我们并不这样判断,因为有的图上可能有重边,这样不好处理.我们记录每条边的标号(一条无向边拆成的两条有向边标号相同),记录每个点的父亲到它的边的标号,如果边(u,v)是v的父亲边,就不能用dfn[u]更新low[v].这样如果遍历完v的所有子节点后,发现low[v]=dfn[v],说明u的父亲边(u,v)为割边. void tarjan(int x) { vis[x]=1; dfn[x]=low[x]=++num; for(int i

tarjan算法(强连通分量 + 强连通分量缩点 + 桥 + 割点 + LCA)

这篇文章是从网络上总结各方经验 以及 自己找的一些例题的算法模板,主要是用于自己的日后的模板总结以后防失忆常看看的, 写的也是自己能看懂即可. tarjan算法的功能很强大, 可以用来求解强连通分量,缩点,桥,割点,LCA等,日后写到相应的模板题我就会放上来. 1.强连通分量(分量中是任意两点间都可以互相到达) 按照深度优先遍历的方式遍历这张图. 遍历当前节点所出的所有边.在遍历过程中: ( 1 ) 如果当前边的终点还没有访问过,访问. 回溯回来之后比较当前节点的low值和终点的low值.将较小

tarjan算法求桥双连通分量 POJ 3177 Redundant Paths

POJ 3177 Redundant Paths Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 12598   Accepted: 5330 Description In order to get from one of the F (1 <= F <= 5,000) grazing fields (which are numbered 1..F) to another field, Bessie and the re

POJ 3694——Network——————【连通图,LCA求桥】

Network Time Limit:5000MS     Memory Limit:65536KB     64bit IO Format:%I64d & %I64u Submit Status Practice POJ 3694 Description A network administrator manages a large network. The network consists of N computers and M links between pairs of compute

HDU 4738 无向图求桥

使用tarjan算法求桥,模板题,但是... 1.有重边 2.不一定连通 3.没有人守桥至少要派一个人去 http://acm.hdu.edu.cn/showproblem.php?pid=4738 这种题挺好的,可以锻炼人的耐性和心理承受能力... #include <iostream> #include <stdio.h> #include <string.h> #include <stdlib.h> #include <vector> us