当前位置: 首页 > news >正文

pku 3694 Network tarjan求割边

http://poj.org/problem?id=3694

给你一个存在桥的无向连通图,每次增加一条边,问每次增加边之后还剩多少个桥。

朴素的办法就是每输入一次tarjan求一次桥的个数,肯定会tle;

正确的做发是,首先求出改图的桥的数量,在tarjan的过程中里用并查集把不是桥的边缩为一点,然后得到一棵树,每加入一条边,就肯定会形成一个环,,然后删除环中石桥的边,最后得出总的桥的数量。删除的过程就是检查是否石桥是就有cut--;

View Code
#include <cstdio>
#include <cstring>
#include <vector>
#include <iostream>
#define maxn 100010
using namespace std;
int low[maxn],dfn[maxn],father[maxn],f[maxn];
int index,n,m,q,cut;
vector<int>g[maxn];
void init(int nn)
{
for (int i = 0; i <= n+1; ++i)
{
g[i].clear();
low[i] = dfn[i] = father[i] = 0;
f[i] = i;
}
index = cut = 0;
}
int find(int x)
{
if (f[x] != x)
f[x] = find(f[x]);
return f[x];
}
int Union(int x,int y)
{
x = find(x);
y = find(y);
if (x != y)
{
f[y] = x;
return 1;
}
else
return 0;

}
void tarjan(int i,int pre)
{
int j,k;
low[i] = dfn[i] = ++index;
for (k = 0; k < g[i].size(); ++k)
{
j = g[i][k];
if (!dfn[j])
{
tarjan(j,i);
low[i] = min(low[i],low[j]);
father[j] = i;//记录每个节点的父亲,方便后面的环中的查找
if (low[j] > dfn[i])//记录桥数
cut++;
else
Union(i,j);//把不是桥的缩为一点
}
else if (j != pre)//这里要注意不能是i的父亲,反之low[i] = low[father[i]]了;
{
low[i] = min(low[i],dfn[j]);
}
}
}
void lca(int u,int v)
{
//在环中找桥的过程
while (u != v)
{
while (dfn[u] >= dfn[v] && u != v)
{
if (Union(u,father[u]))
cut--;
u = father[u];
}
while (dfn[v] >= dfn[u] && u != v)
{
if (Union(v,father[v]))
cut--;
v = father[v];
}
}
}
int main()
{
//freopen("d.txt","r",stdin);
int i,x,y,cas = 1;
while (scanf("%d%d",&n,&m))
{
if (!n && !m) break;
printf("Case %d:\n",cas++);
init(n);
for (i = 0; i < m; ++i)
{
scanf("%d%d",&x,&y);
g[x].push_back(y);
g[y].push_back(x);
}
/*for (i = 1; i <= n; ++i)
{
for (int j = 0; j < g[i].size(); ++j)
printf("%d ",g[i][j]);
puts(" ");
}
*/
tarjan(1,-1);
//printf(">>>%d\n",cut);
cin>>q;
while (q--)
{
cin>>x>>y;
lca(x,y);
printf("%d\n",cut);
}
printf("\n");
}
return 0;
}



相关文章:

  • 在Ubuntu11.10中安装OpenCV2.3.1的详细步骤
  • BAP研究之bap_block_s
  • 转载 - 18个最佳代码编辑器/IDE推荐
  • discuzx中DIY的时候模块
  • linux启动mysql和memcached
  • CentOS 5.5下升级OpenSSH-4.3p2到5.6p1
  • 解决系统日志: kernel: printk: xxxx messages suppressed.问题
  • 用Opencv保存视频文件avi(转)
  • Cisco Packet Tracer模拟器3650交换机新发现
  • 学习编写测试桩之declspec (dllexport)篇
  • Sersync的安装和使用
  • pthread多线程学习笔记五条件变量2使用
  • weblogic的安装和配置
  • SQL Server中的Merge关键字
  • WorkFlow扩展篇Step.2—集合分组下的活动使用[下]-WF4.0
  • 2019.2.20 c++ 知识梳理
  • ECMAScript6(0):ES6简明参考手册
  • GitUp, 你不可错过的秀外慧中的git工具
  • mysql innodb 索引使用指南
  • SOFAMosn配置模型
  • Tornado学习笔记(1)
  • 工作踩坑系列——https访问遇到“已阻止载入混合活动内容”
  • 后端_MYSQL
  • 基于Android乐音识别(2)
  • 基于Mobx的多页面小程序的全局共享状态管理实践
  • 开发了一款写作软件(OSX,Windows),附带Electron开发指南
  • 前端每日实战:70# 视频演示如何用纯 CSS 创作一只徘徊的果冻怪兽
  • 使用 @font-face
  • 数据可视化之 Sankey 桑基图的实现
  • 微信端页面使用-webkit-box和绝对定位时,元素上移的问题
  • 学习笔记TF060:图像语音结合,看图说话
  • 与 ConTeXt MkIV 官方文档的接驳
  • 国内唯一,阿里云入选全球区块链云服务报告,领先AWS、Google ...
  • ​LeetCode解法汇总1410. HTML 实体解析器
  • ​ssh-keyscan命令--Linux命令应用大词典729个命令解读
  • ​软考-高级-系统架构设计师教程(清华第2版)【第1章-绪论-思维导图】​
  • $GOPATH/go.mod exists but should not goland
  • ( 10 )MySQL中的外键
  • (BFS)hdoj2377-Bus Pass
  • (分布式缓存)Redis分片集群
  • (附源码)springboot宠物管理系统 毕业设计 121654
  • (七)理解angular中的module和injector,即依赖注入
  • (转)LINQ之路
  • (转)利用PHP的debug_backtrace函数,实现PHP文件权限管理、动态加载 【反射】...
  • (转)淘淘商城系列——使用Spring来管理Redis单机版和集群版
  • .gitignore文件_Git:.gitignore
  • .NET Core 和 .NET Framework 中的 MEF2
  • .NET Framework Client Profile - a Subset of the .NET Framework Redistribution
  • .NET 读取 JSON格式的数据
  • .NET 自定义中间件 判断是否存在 AllowAnonymousAttribute 特性 来判断是否需要身份验证
  • .NET/C# 的字符串暂存池
  • .py文件应该怎样打开?
  • /proc/interrupts 和 /proc/stat 查看中断的情况
  • []使用 Tortoise SVN 创建 Externals 外部引用目录
  • [2019.3.20]BZOJ4573 [Zjoi2016]大森林