题意:有一个网络有一些边相互连接,现在有Q次操作,求每次操作后的桥的个数
分析:开始竟然不知道还有LCA这么个东西.......
*****************************************************************
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std; const int MAXN = 1e5+; /********添加边*************/
struct Edage{int v, next, used;}e[MAXN<<];
int Head[MAXN], cnt;
void AddEdge(int u, int v)
{
    e[cnt].v = v;
    e[cnt].next = Head[u];
    e[cnt].used = false;
    Head[u] = cnt++;
}
/***********Tarjan算法变量**********/
int dfn[MAXN], low[MAXN], Index;
int fa[MAXN];
int isbridge[MAXN], nbridge; void InIt(int N)
{
    cnt = Index = nbridge = ;     for(int i=; i<=N; i++)
    {
        Head[i] = -;
        dfn[i] = ;
        isbridge[i] = false;
    }
}
void Tarjan(int u, int father)
{
    int v;     low[u] = dfn[u] = ++Index;
    fa[u] = father;     for(int j=Head[u]; j!=-; j=e[j].next)
    {
        if(e[j].used == false)
        {
            e[j].used = e[j^].used = true;
            v = e[j].v;
            if( !dfn[v] )
            {
                Tarjan(v, u);
                low[u] = min(low[u], low[v]);                 if( low[v] > dfn[u] )
                {
                    isbridge[v] = true;
                    nbridge++;
                }
            }
            else
                low[u] = min(low[u], dfn[v]);
        }
    }
} void LCA(int u, int v)
{
    if(dfn[u] < dfn[v])
        swap(u, v);     while(dfn[u] > dfn[v])
    {
        if(isbridge[u])nbridge--;
        isbridge[u] = false;
        u = fa[u];
    }     while(u != v)
    {
        if(isbridge[u])nbridge--;
        if(isbridge[v])nbridge--;
        isbridge[u] = isbridge[v] = false;         u = fa[u], v = fa[v];
    }
} int main()
{
    int N, M, t=;     while(scanf("%d%d", &N, &M), N+M)
    {
        int u, v;         InIt(N);         while(M--)
        {
            scanf("%d%d", &u, &v);
            AddEdge(u, v);
            AddEdge(v, u);
        }         Tarjan(, );         scanf("%d", &M);         printf("Case %d:\n", t++);
        while(M--)
        {
            scanf("%d%d", &u, &v);
            LCA(u, v);
            printf("%d\n", nbridge);
        }         printf("\n");
    }     return ; } 

D - Network - poj3694(LCA求桥)的更多相关文章

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

    Network Time Limit:5000MS     Memory Limit:65536KB     64bit IO Format:%I64d & %I64u Submit Stat ...

  2. poj3694+hdu2460 求桥+缩点+LCA/tarjan

    这个题使我更深理解了TARJAN算法,题意:无向图,每添加一条边后文桥的数量,三种解法:(按时间顺序),1,暴力,每每求桥,听说这样能过,我没过,用的hash判重,这次有俩个参数(n->10w, ...

  3. [POJ3694]Network(LCA, 割边, 桥)

    题目链接:http://poj.org/problem?id=3694 题意:给一张图,每次加一条边,问割边数量. tarjan先找出所有割边,并且记录每个点的父亲和来自于哪一条边,然后询问的时候从两 ...

  4. poj 3694 Network(割边+lca)

    题目链接:http://poj.org/problem?id=3694 题意:一个无向图中本来有若干条桥,有Q个操作,每次加一条边(u,v),每次操作后输出桥的数目. 分析:通常的做法是:先求出该无向 ...

  5. poj 3417 Network(tarjan lca)

    poj 3417 Network(tarjan lca) 先给出一棵无根树,然后下面再给出m条边,把这m条边连上,然后每次你能毁掉两条边,规定一条是树边,一条是新边,问有多少种方案能使树断裂. 我们设 ...

  6. tarjan求桥、割顶

    若low[v]>dfn[u],则(u,v)为割边.但是实际处理时我们并不这样判断,因为有的图上可能有重边,这样不好处理.我们记录每条边的标号(一条无向边拆成的两条有向边标号相同),记录每个点的父 ...

  7. 【HDU4612】 双连通分量求桥

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4612 题目大意:给你一个无向图,问你加一条边后最少还剩下多少多少割边. 解题思路:好水的一道模板题.先 ...

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

    POJ 3177 Redundant Paths Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 12598   Accept ...

  9. uva 796 Critical Links(无向图求桥)

    https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem& ...

随机推荐

  1. C++[类设计] ini配置文件读写类config

      //in Config.h #pragma once #include <windows.h> #include <shlwapi.h> #pragma comment(l ...

  2. JAVA虚拟机与内存

    资料整理自网络(侵删) JVM内存 组成 JAVA的JVM的内存可分为3个区:堆(heap).栈(stack)和方法区(method) 栈区: 1.每个线程包含一个栈区,栈中只保存基础数据类型的对象和 ...

  3. SpringMVC08转发和重定向

    public class User { private String name; private Integer age; public String getName() { return name; ...

  4. N!水题

    //题目是求N!的问题,思路:设定一个整形数组来存放每次计算过后的值 有两个for循环,第一个for循环每次加进一个数 然后在第二个for循环里面计算出此时的阶乘,比如9999,先给出i=2 在第二个 ...

  5. 趣味算法——青蛙过河(JAVA)

    青蛙过河是一个非常有趣的智力游戏,其大意如下: 一条河之间有若干个石块间隔,有两队青蛙在过河,每队有3只青蛙,这些青蛙只能向前移动,不能向后移动,且一次只能有一只青蛙向前移动.在移动过程中,青蛙可以向 ...

  6. gitHub项目框架使用排名

    项目名称 项目简介                                  使用心得                1. react-native 这 个是 Facebook 在 React ...

  7. ImageView设置点击效果没有用?ImageView src的图片大小改变不了?

    ImageView设置点击效果没有用? 解决 1.ImageView xml里面必须clickable 和longClickable为true <ImageView android:layout ...

  8. 在birt中解决引用了不存在的绑定出现的问题

    在birt中常出现这个错误,xxx引用了不存在的绑定. 当你选中整个表,然后在下方属性编辑器旁边的绑定中可以看到绑定的字段.不需要的就可以删掉.也可以进行编辑. 想对查出来的数据加条件.可以选中数据明 ...

  9. Ps 美白磨皮【1】

      方法一:去色加图层模式法 打开需要编辑的图片,按Ctrl+J复制新的图层1. 点击菜单栏“图像”-“调整”-“去色”,如下图所示. 将图层面板的混合模式更改为“滤色”,如下图4所示. 最后的显示效 ...

  10. react-native-router-flux 下部导航

    github url:https://github.com/aksonov/react-native-router-flux API: https://github.com/aksonov/react ...