poj 3694 Network
题意: 添加每条新连接后网络中桥的数目
// 超时 先放着了 ,下次改
//早上这代码超时了 下午改了,代码在下面
#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的更多相关文章
- Poj 3694 Network (连通图缩点+LCA+并查集)
题目链接: Poj 3694 Network 题目描述: 给出一个无向连通图,加入一系列边指定的后,问还剩下多少个桥? 解题思路: 先求出图的双连通分支,然后缩点重新建图,加入一个指定的边后,求出这条 ...
- POJ 3694——Network——————【连通图,LCA求桥】
Network Time Limit:5000MS Memory Limit:65536KB 64bit IO Format:%I64d & %I64u Submit Stat ...
- [双连通分量] POJ 3694 Network
Network Time Limit: 5000MS Memory Limit: 65536K Total Submissions: 9434 Accepted: 3511 Descripti ...
- poj 3694 Network 边双连通+LCA
题目链接:http://poj.org/problem?id=3694 题意:n个点,m条边,给你一个连通图,然后有Q次操作,每次加入一条边(A,B),加入边后,问当前还有多少桥,输出桥的个数. 解题 ...
- POJ 3694 Network (tarjan + LCA)
题目链接:http://poj.org/problem?id=3694 题意是给你一个无向图n个点,m条边,将m条边连接起来之后形成一个图,有Q个询问,问将u和v连接起来后图中还有多少个桥. 首先用t ...
- poj 3694 Network(双连通分量)
题目:http://poj.org/problem?id=3694 #include <iostream> #include <cstring> #include <cs ...
- poj 3694 Network(割边+lca)
题目链接:http://poj.org/problem?id=3694 题意:一个无向图中本来有若干条桥,有Q个操作,每次加一条边(u,v),每次操作后输出桥的数目. 分析:通常的做法是:先求出该无向 ...
- poj 3694 Network : o(n) tarjan + O(n) lca + O(m) 维护 总复杂度 O(m*q)
/** problem: http://poj.org/problem?id=3694 问每加一条边后剩下多少桥 因为是无向图,所以使用tarjan缩点后会成一棵树并维护pre数组 在树上连一条边(a ...
- POJ 3694 Network (求桥,边双连通分支缩点,lca)
Network Time Limit: 5000MS Memory Limit: 65536K Total Submissions: 5619 Accepted: 1939 Descripti ...
- POJ 3694 Network(Tarjan求割边+LCA)
Network Time Limit: 5000MS Memory Limit: 65536K Total Submissions: 10969 Accepted: 4096 Descript ...
随机推荐
- Unity3d Detect NetState
public static bool HasConnection() { System.Net.WebClient client; System.IO.Stream stream; try { usi ...
- REST_FRAMEWORK加深记忆-加了API_ROOT及超链接的CASE
urls.py from django.conf.urls import url from rest_framework.urlpatterns import format_suffix_patter ...
- Windows JDK环境变量的配置
下载JDK:http://www.oracle.com/technetwork/java/javase/downloads/index.html 安装 计算机-->属性-->高级系统设置- ...
- jackson基于注解的简单使用
Jackson提供了一系列注解,方便对JSON序列化和反序列化进行控制,下面介绍一些常用的注解. 1.@JsonIgnore 此注解用于属性上,作用是进行JSON操作时忽略该属性. 2.@JsonFo ...
- java retention注解
Retention注解 Retention(保留)注解说明,这种类型的注解会被保留到那个阶段. 有三个值:1.RetentionPolicy.SOURCE —— 这种类型的Annotations只在源 ...
- 向ArcMap添加未出现的工具 如planarize lines
打开某工具的customize 找到你要添加的工具 将其拖到你要放置的工具条即可
- 开源调度框架Quartz最佳实践
开源调度框架Quartz最佳实践 Quartz是一个Java调度框架,当前的最新版本为2.2.1. 以Quartz 2.2.1版为例,Quartz最佳实践(用于生产系统)总结如下: 1.跳过更新检查Q ...
- IE6-IE11兼容性问题列表及解决办法
IE6-IE11兼容性问题列表及解决办法总结 相比IE6-IE9那版,主要添加IE10和IE11的新变化. 以下是目录及下载链接: 目录概述 2第一章:HTML 3第一节:IE7-IE8更新 3 1. ...
- java工具类–自动将数据库表生成javabean
最近和数据库的表打交道挺多的,因为暂时做的是接口活. 在这过程中发现要把表转换成对应的javabean类型,字段少的表还行,如果不小心碰到几十个字段的他妈的写起来就有点麻烦了,万一碰到几百个的呢,那不 ...
- java教材
教材blog !!http://www.w3cschool.cc/java/java-tutorial.html ok http://www.douban.com/group/topic/ ...