Network(poj 3694)
题意:一个无向图可以有重边,下面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)的更多相关文章
- (POJ 3694) Network 求桥个数
题目链接:http://poj.org/problem?id=3694Description A network administrator manages a large network. The ...
- ZOJ 1914 Arctic Network (POJ 2349) MST
http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=1914 http://poj.org/problem?id=2349 题目大 ...
- POJ 1966:Cable TV Network(最小点割集)***
http://poj.org/problem?id=1966 题意:给出一个由n个点,m条边组成的无向图.求最少去掉多少点才能使得图中存在两点,它们之间不连通. 思路:将点i拆成a和b,连一条a-&g ...
- POJ - 1459 Power Network(最大流)(模板)
1.看了好久,囧. n个节点,np个源点,nc个汇点,m条边(对应代码中即节点u 到节点v 的最大流量为z) 求所有汇点的最大流. 2.多个源点,多个汇点的最大流. 建立一个超级源点.一个超级汇点,然 ...
- 01背包问题:Charm Bracelet (POJ 3624)(外加一个常数的优化)
Charm Bracelet POJ 3624 就是一道典型的01背包问题: #include<iostream> #include<stdio.h> #include& ...
- Scout YYF I(POJ 3744)
Scout YYF I Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 5565 Accepted: 1553 Descr ...
- 广大暑假训练1(poj 2488) A Knight's Journey 解题报告
题目链接:http://vjudge.net/contest/view.action?cid=51369#problem/A (A - Children of the Candy Corn) ht ...
- 1 - ImageNet Classification with Deep Convolutional Neural Network (阅读翻译)
ImageNet Classification with Deep Convolutional Neural Network 利用深度卷积神经网络进行ImageNet分类 Abstract We tr ...
- 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 ...
随机推荐
- 3、InputStream
package com.io.file; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoun ...
- 208 Implement Trie (Prefix Tree) 字典树(前缀树)
实现一个 Trie (前缀树),包含 insert, search, 和 startsWith 这三个方法.注意:你可以假设所有的输入都是小写字母 a-z.详见:https://leetcode.co ...
- Kali linux 2016.2(Rolling)里的枚举服务
前言 枚举是一类程序,它允许用户从一个网络中收集某一类的所有相关服务.
- git + git flow 的简单介绍
1.git简单实用 git:是一种分布式版本控制系统,因为其优秀的特性个人十分推崇. 1.1设置本机用户身份 git config -global user.name "userName&q ...
- 使用Jquery1.9 版本 来实现全选
在使用Jquery实现全选以及反选的时候, 使用attr()实现的时候,在浏览器第一次运行可以全选,但是第二次再全选,不管用. 通过查找资料,用 prop()方法代替attr()方法就行了. 注意: ...
- linux下PPTP Server测试环境搭建
1.1 服务器软件安装 安裝PPTP Server 所需的软件: 安装PPTP: sudo apt-get install pptpd PPTP Server的软件安装很简单,只需要安装pptpd ...
- [eclipse]的快捷键的设置
今天新解压了一个eclipse,发现alt+/提示的快捷键不好用了,开始比较犯懒,但是发现开发效率低下,总结几个eclipse下快捷方式的解决办法. 第一个解决没有一点提示的情况. 1.首先通过菜单打 ...
- leetcode_1015. Numbers With Repeated Digits
https://leetcode.com/problems/numbers-with-repeated-digits/ 与leetcode_357. Count Numbers with Unique ...
- STL中unique的使用
作用 unique函数可以删除有序数组中的重复元素,即去重(并不是真正的删除,后面会讲) 定义在头文件<algorithm>中 函数原型 1.只有两个参数,且参数类型都是迭代器: iter ...
- CAD参数绘制角度标注(com接口)
主要用到函数说明: _DMxDrawX::DrawDimAngular 绘制一个角度标注.详细说明如下: 参数 说明 DOUBLE dAngleVertexX 角度标注的顶点的X值 DOUBLE dA ...