关闭

POJ3694 Network 割边+LCA

标签: c++
544人阅读 评论(0) 收藏 举报
分类:

题目链接:

Poj3694



题意:

给出一个N(1 ≤ N ≤ 100,000)个点 和 M(N - 1 ≤ M ≤ 200,000)的连通图.

有Q ( 1 ≤ Q ≤ 1,000)个询问 每次询问增加一条边(累加下去)

输出每增加一条边后剩下的桥的数量




题解:

10W点加1000次询问 每次询问都用Tarjin算法求一次肯定会超时的

考虑  每次加一条边a-b的实质:

从a到b的路径中的所有割边都将消失

那如何记录这条路径呢

在Tarjan算法递归的过程中通过树边建立一棵树 

然后每次询问分别从a  b开始 一直到它们的最近公共祖先 出现的割边全部消失即可


代码:


#include<iostream>
#include<cstdio>
#include<cstring>
#include<vector>
#define maxn 100050
using namespace std;
struct node{
    int to,next;
}edge[maxn*4];
int head[maxn];
int s;

int dfn[maxn],low[maxn],num;

int level[maxn],fa[maxn];
int flag[maxn];
int n,ans;
void init()
{
    memset(head,-1,sizeof(head));
    memset(dfn,0,sizeof(dfn));
    memset(flag,0,sizeof(flag));
    s=ans=num=0;
    level[0]=0;
    for(int i=1;i<=n;i++)
        fa[i]=i;
}

void addedge(int a,int b)
{
    edge[s]={b,head[a]};
    head[a]=s++;
}

void lca(int a,int b)
{
    while(level[b]>level[a])
    {
        if(flag[b])
            ans--,flag[b]=0;
        b=fa[b];
    }
    while(level[a]>level[b])
    {
        if(flag[a])
            ans--,flag[a]=0;
        a=fa[a];
    }
    while(a!=b)
    {
        if(flag[a])
            ans--,flag[a]=0;
        if(flag[b])
            ans--,flag[b]=0;
        a=fa[a],b=fa[b];
    }
}

void Tarjan(int u,int pre)
{
    dfn[u]=low[u]=++num;
    level[u]=level[pre]+1;              //建树
    for(int i=head[u];i!=-1;i=edge[i].next)
    {
        int v=edge[i].to;
        if(!dfn[v])
        {
            fa[v]=u;
            Tarjan(v,u);
            low[u]=min(low[u],low[v]);
            if(dfn[u]<low[v])         //标记割边
                flag[v]=1,ans++;
        }
        if(v!=pre)
            low[u]=min(low[u],dfn[v]);
    }
}

int main()
{
    int m,a,b;
    int Case=1;
    while(scanf("%d%d",&n,&m)&&(n+m))
    {
        init();
        while(m--)
        {
            scanf("%d%d",&a,&b);
            addedge(a,b);
            addedge(b,a);
        }
        Tarjan(1,0);
        scanf("%d",&m);
        printf("Case %d:\n",Case++);
        while(m--)
        {
            scanf("%d%d",&a,&b);
            if(ans!=0)
                lca(a,b);
            printf("%d\n",ans);
        }
        printf("\n");
    }
    return 0;
}

0
0
查看评论

POJ3694 Network 割边 LCA

题意:有n台电脑,他们之间有m条线使得它们能够通讯联网,有些网线是重要的,如果出故障会使得部分电脑无法连通。称这种出故障能造成无法连通的线为桥,现在为了测试,在原来的基础基础上新加Q条网线,每加一条判断,判断网络中有多少桥。 也就是求无向图割边(桥)的数量。当然不能没加一条,就用tarjin算法来求...
  • chen_minghui
  • chen_minghui
  • 2017-02-19 22:13
  • 108

poj3694(割边,LCA)

Network Time Limit: 5000MS   Memory Limit: 65536K Total Submissions: 8578   Accepted: 3138 ...
  • martinue
  • martinue
  • 2016-05-11 15:37
  • 235

POJ3694 Network(边双连通+LCA)

题意:给一个n顶点m条边的无向图,有若干条桥,现在有q个询问,每次询问在这个图里面添加一条边,问添加这条边之后剩下的桥的数目有多少 思路:百度了很久题解..主要是丝毫不会LCA..做法就是先求出图中的桥和双连通分量,缩点(这里不用真的缩点,其实DFS留下的low和pre数组,记录每个点的父节点就能...
  • qq_21057881
  • qq_21057881
  • 2016-02-05 22:37
  • 180

POJ3694 Network (缩点+并查集+LCA)

Network Time Limit: 5000MS   Memory Limit: 65536K Total Submissions: 10825   Accepted: 4043 ...
  • m0_37134257
  • m0_37134257
  • 2018-01-26 15:47
  • 37

POJ 3694 Network 割边+LCA

A network administrator manages a large network. The network consists of N computers and M links between pairs of computers. Any pair of computers are...
  • qq_35776409
  • qq_35776409
  • 2017-06-03 20:30
  • 161

POJ 3694 Network(割边+LCA)

<br />//Tarjan求桥 + LCA //蛋疼题目,确实想不到用LCA这个如此巧妙的方法,主要也就写下求桥,对Tarjan的DFN,LOW值再加深下理解 //重点是对桥的记录,本来想通过用边来记录,后来发现这是无解的,用桥与点对应就可以了 //一开始还想实践下LRJ书里面说...
  • ChinaCzy
  • ChinaCzy
  • 2011-05-05 21:14
  • 2245

POJ 3694 Network(割边+LCA)

题意:一个无向图可以有重边,下面q个操作,每次在两个点间连接一条边,每次连接后整个无向图还剩下多少桥(注意是要考虑之前连了的边,每次回答是在上一次的基础之上) 思路:先跑一次tarjan,求出桥和缩点,那么远无向图将缩点为一棵树,树边正好是原来的桥。每次连接两点,看看 这两点是不是在同一...
  • CillyB
  • CillyB
  • 2017-05-02 00:17
  • 145

POJ 3694 Network 割边+LCA

这道题跟3177意思差不多,不过最后问的不一样,说是加入某条边后,问图内剩余的桥有多少。 这题的大概思路就是,先求割边并标记,然后缩点,形成一棵树,然后把这颗树上各个结点的父结点用dfs求出来,再然后就是LCA了,因为加入某条边后,树内会形成一个圈,这个圈上所有的边将不再是桥,可以发现跟LCA的关...
  • sdj222555
  • sdj222555
  • 2012-01-20 01:31
  • 3873

hdu 3078 Network(lca 倍增)

Network Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Total Submission(s): 1353  ...
  • yjf3151731373
  • yjf3151731373
  • 2017-08-15 11:58
  • 119

poj3694 Network 边双联通缩点+离线LCA

给一个联通的图,然后依次添加Q条边,每次添加边之后,图中还剩多少条桥?先求一下边双联通重构成一棵树,然后就是求LCA了,查询的时候从两个点开始往祖先一边爬一边标记掉沿途的边,根据每次标记掉的点以及上一次的答案就可以递推出当前的答案...切记一点这题有重边...所以求ebc的时候记得用边判父节点......
  • yanglei040
  • yanglei040
  • 2014-02-07 21:47
  • 569