POJ3694:Network(并查集+缩点+lca)

Network

Time Limit: 5000MS   Memory Limit: 65536K
Total Submissions: 13172   Accepted: 4774

题目链接:http://poj.org/problem?id=3694

Description:

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 connected directly or indirectly by successive links, so data can be transformed between any two computers. The administrator finds that some links are vital to the network, because failure of any one of them can cause that data can‘t be transformed between some computers. He call such a link a bridge. He is planning to add some new links one by one to eliminate all bridges.

You are to help the administrator by reporting the number of bridges in the network after each new link is added.

Input:

The input consists of multiple test cases. Each test case starts with a line containing two integers N(1 ≤ N ≤ 100,000) and M(N - 1 ≤ M ≤ 200,000).
Each of the following M lines contains two integers A and B ( 1≤ A ≠ B ≤ N), which indicates a link between computer A and B. Computers are numbered from 1 to N. It is guaranteed that any two computers are connected in the initial network.
The next line contains a single integer Q ( 1 ≤ Q ≤ 1,000), which is the number of new links the administrator plans to add to the network one by one.
The i-th line of the following Q lines contains two integer A and B (1 ≤ A ≠ B ≤ N), which is the i-th added new link connecting computer A and B.

The last test case is followed by a line containing two zeros.

Output:

For each test case, print a line containing the test case number( beginning with 1) and Q lines, the i-th of which contains a integer indicating the number of bridges in the network after the first i new links are added. Print a blank line after the output for each test case.

Sample Input:

3 2
1 2
2 3
2
1 2
1 3
4 4
1 2
2 1
2 3
1 4
2
1 2
3 4
0 0

Sample Output:

Case 1:
1
0

Case 2:
2
0

题意:

首先给出一个无向图,然后不断加边,每次加一条边就输出当前图中桥有多少个。

题解:

首先单独计算桥很容易,但这个加边操作有点烦人,不可能每次加条边就求次桥吧。然后我们主要想的就是新边和原图的关系。

因为原图是连通的,在原图中,我们很容易把桥求出来,并且将相应的点进行缩点(这里我用的并查集),最后的图中的边都为桥,且无向图变成了树。

那么每次新加入一条边,如果它连接的为不在一个集合中的点,那么必然会影响到从u到v简单路径上面的桥;否则就不影响。

下面关键就是求这个简单路径,由于这个题数据量较小,用个朴素的lca就行了,这里的lca没有用深度来,而是根据dfn,很好地利用了时间戳。

代码如下:

#include <cstdio>
#include <cstring>
#include <algorithm>
#include <iostream>
#include <queue>
using namespace std;
typedef long long ll;
const int N = 1e5+5,M  = 2e5+5;
int n,m,ans;
int head[N];
struct Edge{
    int u,v,next;
}e[M<<1];
int T,tot;
int dfn[N],low[N],cut[N],f[N],pa[N];
void adde(int u,int v){
    e[tot].u=u;e[tot].v=v;e[tot].next=head[u];head[u]=tot++;
}
void init(){
    T=0;tot=0;ans=0;
    memset(head,-1,sizeof(head));
    memset(cut,0,sizeof(cut));
    memset(dfn,0,sizeof(dfn));
    memset(pa,0,sizeof(pa));
    for(int i=0;i<=n;i++) f[i]=i;
}
int find(int x){
    return f[x]==x ? x : f[x]=find(f[x]);
}
void Union(int u,int v){
    int fx=find(u),fy=find(v);
    if(fx!=fy) f[fx]=fy;
    return ;
}
void Tarjan(int u,int pre){
    dfn[u]=low[u]=++T;
    int son=0;
    for(int i=head[u];i!=-1;i=e[i].next){
        int v=e[i].v;
        if(v==pre) continue ;
        if(!dfn[v]){
            pa[v]=u;
            Tarjan(v,u);
            low[u]=min(low[u],low[v]);
            if(low[v]>dfn[u]){
                cut[v]=1;
                ans++;
            }else Union(u,v);
        }else{
            low[u]=min(low[u],dfn[v]);
        }
    }
}
int lca(int u,int v){
    if(dfn[u]<dfn[v]) swap(u,v);
    while(dfn[u]>dfn[v]){
        int fx=find(u),fy=find(pa[u]);
        if(fx!=fy){
            ans--;
            f[fx]=fy;
        }
        u=pa[u];
    }
    while(dfn[v]>dfn[u]){
        int fx=find(v),fy=find(pa[v]);
        if(fx!=fy){
            ans--;
            f[fx]=fy;
        }
        v=pa[v];
    }
    return ans ;
}
int main(){
    int cnt = 0;
    while(scanf("%d%d",&n,&m)!=EOF){
        if(n+m<=0) break ;
        cnt++;
        init();
        for(int i=1;i<=m;i++){
            int u,v;
            scanf("%d%d",&u,&v);
            adde(u,v);adde(v,u);
        }
        Tarjan(1,-1);
        int q;
        printf("Case %d:\n",cnt);
        scanf("%d",&q);
        while(q--){
            int u,v;
            scanf("%d%d",&u,&v);
            printf("%d\n",lca(u,v));
        }
    }
    return 0;
}

原文地址:https://www.cnblogs.com/heyuhhh/p/10393241.html

时间: 2024-10-13 16:06:49

POJ3694:Network(并查集+缩点+lca)的相关文章

[LA] 3027 - Corporative Network [并查集]

A very big corporation is developing its corporative network. In the beginning each of the N enterprises of the corporation, numerated from 1 to N, organized its own computing and telecommunication center. Soon, for amelioration of the services, the

POJ 2236 Wireless Network (并查集)

Wireless Network Time Limit: 10000MS   Memory Limit: 65536K Total Submissions: 18066   Accepted: 7618 Description An earthquake takes place in Southeast Asia. The ACM (Asia Cooperated Medical team) have set up a wireless network with the lap computer

POJ1962:Corporative Network(并查集)

Description A very big corporation is developing its corporative network. In the beginning each of the N enterprises of the corporation, numerated from 1 to N, organized its own computing and telecommunication center. Soon, for amelioration of the se

poj2236 Wireless Network 并查集简单应用

Description An earthquake takes place in Southeast Asia. The ACM (Asia Cooperated Medical team) have set up a wireless network with the lap computers, but an unexpected aftershock attacked, all computers in the network were all broken. The computers

【bzoj3362/3363/3364/3365】[Usaco2004 Feb]树上问题杂烩 并查集/树形dp/LCA/树的点分治

题目描述 农夫约翰有N(2≤N≤40000)个农场,标号1到N,M(2≤M≤40000)条的不同的垂直或水平的道路连结着农场,道路的长度不超过1000.这些农场的分布就像下面的地图一样, 图中农场用F1..F7表示, 每个农场最多能在东西南北四个方向连结4个不同的农场.此外,农场只处在道路的两端.道路不会交叉且每对农场间有且仅有一条路径.邻居鲍伯要约翰来导航,但约翰丢了农场的地图,他只得从电脑的备份中修复了.每一条道路的信息如下: 从农场23往南经距离10到达农场17 从农场1往东经距离7到达农

poj2236(Wireless Network)并查集

Description An earthquake takes place in Southeast Asia. The ACM (Asia Cooperated Medical team) have set up a wireless network with the lap computers, but an unexpected aftershock attacked, all computers in the network were all broken. The computers

Wireless Network 并查集

Wireless Network An earthquake takes place in Southeast Asia. The ACM (Asia Cooperated Medical team) have set up a wireless network with the lap computers, but an unexpected aftershock attacked, all computers in the network were all broken. The compu

北大ACM2236——Wireless Network~~并查集

这一题,题目的大概意思是:有N台电脑,彼此直接能通信的最大距离为T,这些电脑因为地震损坏了,需要修理.修理之后,就可以跟其他的修理过的距离小于等于T的电脑通信,你需要回答的是某两台电脑是否能够通信. 简单的并查集的应用,只是加了一个限制条件. 输入N和T,下面N行为N个电脑的坐标. 再下面的是一直到文件结尾,输入O k,表示k电脑进行修理.输入S i j ,表示问你这两台电脑是否能够通信. 我用一个dis数组来存每两台电脑之间的距离,方便后面的判断. 下面是AC的代码,有详细的注释: #incl

poj 2236 Wireless Network (并查集)

链接:http://poj.org/problem?id=2236 题意: 有一个计算机网络,n台计算机全部坏了,给你两种操作: 1.O x 修复第x台计算机 2.S x,y 判断两台计算机是否联通 联通的条件: 两台都修复好了,求距离小于d 思路: 数据很小,我们可以没修复一台就直接枚举已经修复的计算机找到距离小于d的,放到一个并查集里,查询的话直接查询是否再同一个并查集里就好了 实现代码: //while(scanf("\n%c", &ope) != EOF) #inclu