题意:一个无向图可以有重边,下面q个操作,每次在两个点间连接一条有向边,每次连接后整个无向图还剩下多少桥(注意是要考虑之前连了的边,每次回答是在上一次的基础之上)

/*
tarjan+LCA
先用tarjan缩点,那么这个图就会变成一棵树,当我们连起不在同一节点时,就相当于
把树上的两个节点连了起来,这两个节点同他们的公共祖先会形成一个新的缩点,每次统计
桥的个数。
*/
#include<iostream>
#include<cstdio>
#include<cstring>
#define M 200010
using namespace std;
int n,m,num,head[M],low[M],dfn[M],topt;
int s[M],top,f[M],sum,belong[M],cnt,cas;
int Num,Head[M],fa[M],c[M],vis[M];
struct node{int v,pre;}e[M*];
struct Node{int v,pre;}E[M*];
void Add(int from,int to)
{
e[num].v=to;
e[num].pre=head[from];
head[from]=num++;
}
void add(int from,int to)
{
E[Num].v=to;
E[Num].pre=Head[from];
Head[from]=Num++;
}
void Tarjan(int x,int fa)
{
low[x]=dfn[x]=++topt;
s[++top]=x;f[x]=;
for(int i=head[x];i!=-;i=e[i].pre)
{
int v=e[i].v;
if(i==(fa^))continue;
if(dfn[v]==)
{
Tarjan(v,i);low[x]=min(low[x],low[v]);
}
else if(f[v])low[x]=min(low[x],dfn[v]);
}
if(low[x]==dfn[x])
{
sum++;
while(x!=s[top])
{
f[s[top]]=;belong[s[top]]=sum;top--;
}
f[s[top]]=;belong[s[top]]=sum;top--;
}
}
void Dfs(int now,int from,int dep)
{
fa[now]=from;c[now]=dep;
for(int i=Head[now];i!=-;i=E[i].pre)
if(E[i].v!=from)
Dfs(E[i].v,now,dep+);
}
void LCA(int a,int b)
{
if(c[a]<c[b])swap(a,b);
int t=c[a]-c[b];
for(int i=;i<=t;i++)
{
if(vis[a]==)cnt--;
vis[a]=;a=fa[a];
}
while(a!=b)
{
if(vis[a]==)cnt--;
vis[a]=;a=fa[a];
if(vis[b]==)cnt--;
vis[b]=;b=fa[b];
}
}
int main()
{
while()
{
scanf("%d%d",&n,&m);
if(n==&&m==)break;
memset(head,-,sizeof(head));
memset(Head,-,sizeof(Head));
memset(low,,sizeof(low));
memset(dfn,,sizeof(dfn));
memset(f,,sizeof(f));
memset(belong,,sizeof(belong));
memset(vis,,sizeof(vis));
memset(c,,sizeof(c));
memset(fa,,sizeof(fa));
memset(s,,sizeof(s));
Num=num=topt=sum=;
int u,v;
for(int i=;i<=m;i++)
{
scanf("%d%d",&u,&v);
Add(u,v);Add(v,u);
}
for(int i=;i<=n;i++)
if(dfn[i]==)
Tarjan(i,-);
for(int u=;u<=n;u++)
for(int i=head[u];i!=-;i=e[i].pre)
if(belong[u]!=belong[e[i].v])
add(belong[u],belong[e[i].v]);
Dfs(,,);cnt=sum-;
scanf("%d",&m);
printf("Case %d:\n",++cas);
for(int i=;i<=m;i++)
{
scanf("%d%d",&u,&v);
int U=belong[u];
int V=belong[v];
if(U==V)
{
printf("%d\n",cnt);continue;
}
LCA(U,V);
printf("%d\n",cnt);
}
}
return ;
}

Network(poj 3694)的更多相关文章

  1. (POJ 3694) Network 求桥个数

    题目链接:http://poj.org/problem?id=3694Description A network administrator manages a large network. The ...

  2. ZOJ 1914 Arctic Network (POJ 2349) MST

    http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=1914 http://poj.org/problem?id=2349 题目大 ...

  3. POJ 1966:Cable TV Network(最小点割集)***

    http://poj.org/problem?id=1966 题意:给出一个由n个点,m条边组成的无向图.求最少去掉多少点才能使得图中存在两点,它们之间不连通. 思路:将点i拆成a和b,连一条a-&g ...

  4. POJ - 1459 Power Network(最大流)(模板)

    1.看了好久,囧. n个节点,np个源点,nc个汇点,m条边(对应代码中即节点u 到节点v 的最大流量为z) 求所有汇点的最大流. 2.多个源点,多个汇点的最大流. 建立一个超级源点.一个超级汇点,然 ...

  5. 01背包问题:Charm Bracelet (POJ 3624)(外加一个常数的优化)

    Charm Bracelet    POJ 3624 就是一道典型的01背包问题: #include<iostream> #include<stdio.h> #include& ...

  6. Scout YYF I(POJ 3744)

    Scout YYF I Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 5565   Accepted: 1553 Descr ...

  7. 广大暑假训练1(poj 2488) A Knight's Journey 解题报告

    题目链接:http://vjudge.net/contest/view.action?cid=51369#problem/A   (A - Children of the Candy Corn) ht ...

  8. 1 - ImageNet Classification with Deep Convolutional Neural Network (阅读翻译)

    ImageNet Classification with Deep Convolutional Neural Network 利用深度卷积神经网络进行ImageNet分类 Abstract We tr ...

  9. Codeforces 500D New Year Santa Network(树 + 计数)

    D. New Year Santa Network time limit per test 2 seconds memory limit per test 256 megabytes input st ...

随机推荐

  1. Android开发学习——游戏开发小demo

    public class MainActivity extends Activity { private GameUI gameUI; @Override protected void onCreat ...

  2. Android BitmapFactory.decodeFile(filePath, options) 返回 Null 6.0权限

    今天在做拍照上传的时候遇到个问题,根据路径获取Bitmap 失败,一直返回空,以为这个路径获取Bitmap代码久经考验,不怀疑它,找参数传入是否正确,初步怀疑是 filePath 没传进去,打印 fi ...

  3. 12. binary search Trees

    12. binary search Trees    The search tree data structure supports many dynamic-set operations,inclu ...

  4. js 日期时间大小比较

    <body> 开始时间:<input onfocus="setday(this)" id="startTime" name="sta ...

  5. 数据库系统概论(1)——Chap. 1 Introduction

    数据库系统概论--Introduction 一.数据库的4个基本概念 数据(data):数据是数据库中存储的基本单位.我们把描述事物的符号记录称为数据.数据和关于数据的解释是不可分的,数据的含义称为数 ...

  6. UI开发复杂度度量

    1)要素的个数: 2)要素布局和渲染的复杂度: 3)交互的复杂度. 本质上分为两种:要素的复杂度和联系的复杂度. 联系包含要素间布局的联系与交互的联系,已经和外部上下文的联系.

  7. C# 处理年月日提取时间

    using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; usin ...

  8. 使用JQuery MiniUI,json数据构建TreeGrid(树图)

    index.html直接上代码. 需要引用MiniUI的boot.js <!DOCTYPE html> <html> <head> <meta charset ...

  9. JavaSE-16 集合框架

    学习要点 Java集合框架内容 ArrayList和LinkedList HashMap Iterator 泛型集合 Java的集合框架 1  概述 数据结构是以某种形式将数据组织在一起的集合,它不仅 ...

  10. 记一次被面试的final问题

    ---- 前言 今天面试被问到了,我们都知道final修饰的东西是不可变的,那么是值不可变还是其地址不可变?一脸懵逼,回来查阅一番,总结一下 --- final与数据 在日常行为下,一般数据指的都是基 ...