题意: 添加每条新连接后网络中桥的数目
// 超时 先放着了 ,下次改
//早上这代码超时了 下午改了,代码在下面
#include <iostream>
#include <algorithm>
#include <queue>
#include <stack>
#include <math.h>
#include <stdio.h>
#include <string.h>
using namespace std;
#define MOD 1000000007
#define maxn 440000
#define maxm 100010
struct Edge{
int to;
int num;
int next;
Edge(){};
Edge(int u,int v){to=u;next=v;}
}E[maxn];
int V[maxm],num;
bool tag[maxn];
int pre[maxm];
int dfst,bcc;
int ans,eg;
void init(int n){
eg=;
dfst=;
num=;
bcc=;
for(int i=;i<=n;i++)
V[i]=-;
}
void add(int u,int v){ // 坑爹 原来原图没有重边的 郁闷 ,这里就耗了不少时间
int e;
for(e=V[u];e!=-;e=E[e].next)
{
if(v==E[e].to){
tag[E[e].num]=;return;
}
}
eg++;
E[num].to=v;
E[num].num=eg;
E[num].next=V[u];
V[u]=num++; E[num].to=u;
E[num].num=eg;
E[num].next=V[v];
V[v]=num++;
}
int dfs(int u,int fa){
int lowu;
lowu=pre[u]=++dfst;
int v,e;
for(e=V[u];e!=-;e=E[e].next){
v=E[e].to;
if(!pre[v]){
int lowv=dfs(v,u);
lowu=min(lowu,lowv);
if(lowv>pre[u]&&!tag[E[e].num]){
ans++;
}
}
else if(v!=fa) lowu=min(lowu,pre[v]);
}
return lowu;
}
int main()
{
int n,m,Q;
int u,v;
int i,j=;
while(scanf("%d %d",&n,&m),n|m){
init(n);
for(i=;i<=m;i++){
scanf("%d %d",&u,&v);
tag[i]=;
add(u,v);
}
printf("Case %d:\n",j++);
scanf("%d",&Q); for(i=;i<=Q;i++) tag[i+m]=;
while(Q--){
scanf("%d %d",&u,&v);
add(u,v);
for(i=;i<=n;i++) pre[i]=;
ans=;
dfst=;
dfs(,);
printf("%d\n",ans);
}
printf("\n");
}
return ;
} // 在原来的基础上 执行一次dfs 然就找两点的lca 我不愿去缩点 啥的, 网上看到一个不错的,就用了
// 就是先让 x,y达到同一深度 然后回走 直到碰面 边上遇到桥就标记删除
#include <iostream>
#include <algorithm>
#include <queue>
#include <stack>
#include <math.h>
#include <stdio.h>
#include <string.h>
using namespace std;
#define MOD 1000000007
#define maxn 440000
#define maxm 100010
struct Edge{
int to;
// int num;
int next;
Edge(){};
Edge(int u,int v){to=u;next=v;}
}E[maxn];
int V[maxm],num;
bool tag[maxm];
int fa[maxm];
int pre[maxm],low;
int dfst;
int ans;
void init(int n){
dfst=;
num=;
ans=;
for(int i=;i<=n;i++){
V[i]=-;
pre[i]=;
tag[i]=;
}
}
void add(int u,int v){
E[num].to=v;
// E[num].num=m;
E[num].next=V[u];
V[u]=num++; E[num].to=u;
// E[num].num=m;
E[num].next=V[v];
V[v]=num++;
}
int dfs(int u,int dp){
int lowu=pre[u]=dp;
int v,e;
for(e=V[u];e!=-;e=E[e].next){
v=E[e].to;
if(!pre[v]){
fa[v]=u;
// printf("?%d %d %d\n",v,u,fa[v]);
int lowv=dfs(v,dp+);
lowu=min(lowu,lowv);
if(lowv>pre[u]){
ans++;
tag[v]=true; //printf("%d",v);
}
}
else if(v!=fa[u]) lowu=min(lowu,pre[v]);
}
// printf("%d %d ",u,fa[u]);
return lowu;
}
void lca(int x,int y){
if(pre[x]>pre[y]) swap(x,y);
while(pre[y]!=pre[x]){
if(tag[y]){ans--;tag[y]=false;}
y=fa[y];
}
while(x!=y){
if(tag[x]){ans--;tag[x]=false;}
if(tag[y]){ans--;tag[y]=false;}
x=fa[x];y=fa[y];
}
}
int main()
{
int n,m,Q;
int u,v;
int i,j=;
while(scanf("%d %d",&n,&m),n|m){
init(n);
for(i=;i<=m;i++){
scanf("%d %d",&u,&v);
add(u,v);
}
fa[]=;
dfs(,);
printf("Case %d:\n",j++);
scanf("%d",&Q);// for(i=1;i<=Q;i++) tag[i+m]=0;
while(Q--){
scanf("%d %d",&u,&v);
lca(u,v);
printf("%d\n",ans);
}
printf("\n");
}
return ;
}
 

poj 3694 Network的更多相关文章

  1. Poj 3694 Network (连通图缩点+LCA+并查集)

    题目链接: Poj 3694 Network 题目描述: 给出一个无向连通图,加入一系列边指定的后,问还剩下多少个桥? 解题思路: 先求出图的双连通分支,然后缩点重新建图,加入一个指定的边后,求出这条 ...

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

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

  3. [双连通分量] POJ 3694 Network

    Network Time Limit: 5000MS   Memory Limit: 65536K Total Submissions: 9434   Accepted: 3511 Descripti ...

  4. poj 3694 Network 边双连通+LCA

    题目链接:http://poj.org/problem?id=3694 题意:n个点,m条边,给你一个连通图,然后有Q次操作,每次加入一条边(A,B),加入边后,问当前还有多少桥,输出桥的个数. 解题 ...

  5. POJ 3694 Network (tarjan + LCA)

    题目链接:http://poj.org/problem?id=3694 题意是给你一个无向图n个点,m条边,将m条边连接起来之后形成一个图,有Q个询问,问将u和v连接起来后图中还有多少个桥. 首先用t ...

  6. poj 3694 Network(双连通分量)

    题目:http://poj.org/problem?id=3694 #include <iostream> #include <cstring> #include <cs ...

  7. poj 3694 Network(割边+lca)

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

  8. poj 3694 Network : o(n) tarjan + O(n) lca + O(m) 维护 总复杂度 O(m*q)

    /** problem: http://poj.org/problem?id=3694 问每加一条边后剩下多少桥 因为是无向图,所以使用tarjan缩点后会成一棵树并维护pre数组 在树上连一条边(a ...

  9. POJ 3694 Network (求桥,边双连通分支缩点,lca)

    Network Time Limit: 5000MS   Memory Limit: 65536K Total Submissions: 5619   Accepted: 1939 Descripti ...

  10. POJ 3694 Network(Tarjan求割边+LCA)

    Network Time Limit: 5000MS   Memory Limit: 65536K Total Submissions: 10969   Accepted: 4096 Descript ...

随机推荐

  1. 【模板】Big-Step-Giant-Step 大步小步

    求一个 的最小整数解 bsgs 当h是质数的时候使用 extbsgs 不满足上面那种情况的时候 具体参见http://tonyfang.is-programmer.com/posts/178997.h ...

  2. asp.net 获取客户机IP地址

    /// <summary> ///get client IP /// </summary> /// <returns></returns> public ...

  3. C#中sealed关键字

    C#中sealed关键字 1. sealed关键字     当对一个类应用 sealed 修饰符时,此修饰符会阻止其他类从该类继承.类似于Java中final关键字.     在下面的示例中,类 B ...

  4. NSString+URLEncoding.h --使用Obj-C对数据等进行URLEncoding编码

    在Objective-c进行网络编程时,经常需要把数据转换成URLEncoding编码,如对+号编码后,变成%2b.这里我们给出一种实现. //NSString+URLEncoding.h #impo ...

  5. SUDT2177体检

    http://acm.sdut.edu.cn/sdutoj/problem.php?action=showproblem&problemid=2177 题目描述 大家都知道,新生入学的前几周要 ...

  6. PSYoungGen /PSOldGen/PSPermGen区别

    原文地址:http://bbs.csdn.net/topics/210064791 谁能解译一下PSYoungGen /PSOldGen/PSPermGen区别及出现的问题? 看来没有收集到答案,查看 ...

  7. cojs 自己出的题目 解题报告

    省选成功成为河北B队队长QAQ 真是忧桑 所以在cojs上出了一套鬼畜的关于树的套题 黑白树: 我们先不考虑R操作 设x是u的祖先,那么fa(x)的贡献显然是 fa(x)*(sz(fa(x))-sz( ...

  8. 【mysql的编程专题】触发器

    类似tp里面的数据模型回调接口,在数据表增删改的前或后触发执行其他的预订的sql; 一个触发器要具备4要素: 1.监视地点 -- 要执行触发器的表 2.监视事件 -- 由什么DML事件来牵引 3.触发 ...

  9. Tomcat处理HTTP请求源码分析(下)

    转载:http://www.infoq.com/cn/articles/zh-tomcat-http-request-2 很多开源应用服务器都是集成tomcat作为web container的,而且对 ...

  10. json的数据格式(仔细查看)

    1.json对象就是jsonObject,jsonobject里可以放入很多键值对,并以逗号为分隔符. jsonObject里还可以嵌套JsonObject对象,或者数组信息作为value,数组作为k ...