题意:

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

思路:

首先运行一次Tarjan,求出桥和缩点,那么远无向图将缩点为一棵树,树边正好是原来的桥。每次连接两点,看看这两点是不是在同一个缩点内,如果是,那么缩点后的树没任何变化,如果两点属于不同的缩点,那么连接起来,然后找这两个缩点的LCA,因为从点u到LCA再到点v再到点u,将形成环,里面的树边都会变成不是桥。计数的时候注意,有些树边可能之前已经被标记了,这次再经过不能再标记。

代码:

#include <iostream>
#include <cstdio>
#include <cstring>
#include <vector> using namespace std;
#define N 100010
#define M 200010 vector<int> ver[N];
int head[N],dfn[N],low[N],vis[N],fa[N],dcnt,bcnt; struct edge{
int u,v,used,next;
}e[*M]; bool isbridge[N]; inline void add(int u, int v ,int &k)
{
e[k].v = v; e[k].used = ;
e[k].next = head[u]; head[u] = k++;
} void LCA(int u,int v)
{
if(dfn[u] < dfn[v]) swap(u,v);
while(dfn[u] > dfn[v])
{
if(isbridge[u]) bcnt--;
isbridge[u] = false;
u = fa[u];
}
while(u!=v)
{
if(isbridge[u]) bcnt--;
if(isbridge[v]) bcnt--;
isbridge[u] = isbridge[v] = false;
u = fa[u]; v = fa[v];
}
} void dfs(int u)
{
vis[u] = ; dfn[u] = low[u] = ++dcnt;
for(int k=head[u]; k!=-; k=e[k].next)
if(!e[k].used)
{
e[k].used = e[k^].used = ;
int v = e[k].v;
if(!vis[v])
{
fa[v] = u;
dfs(v);
low[u] = min(low[u] , low[v]);
if(dfn[u] < low[v])
{ bcnt++; isbridge[v] = true; }
}
else if(vis[v] == ) low[u] = min(low[u],dfn[v]);
}
vis[u] = ;
} int main()
{
int n,m,q,cas=;
while(cin>>n>>m,n,m)
{
memset(head,-,sizeof(head));
int k = ;
for(int i=; i<m; i++)
{
int u,v;
cin>>u>>v;
add(u,v,k);
add(v,u,k);
}
memset(isbridge,false,sizeof(isbridge));
memset(vis,,sizeof(vis));
dcnt = bcnt = ;
fa[] = ;
dfs();
printf("Case %d:\n",++cas);
cin>>q;
while(q--)
{
int u,v;
cin>>u>>v;
LCA(u,v);
cout<<bcnt<<endl;
}
cout<<endl;
}
return ;
}

最新文章

  1. ubuntu kylin 14.04安装Node.js和Famous
  2. 关于MapReduce中自定义分组类(三)
  3. 使用WKWebView替换UIWebView
  4. 服务器 CentOS上yum安装Nginx服务
  5. [转载] linux 程序运行过程中替换文件
  6. C#语言的Image和byte数组的互相转换
  7. ural 1333 Genie Bomber 2
  8. TP5框架,开源小程序商城源码,前端+后台完整版
  9. scrapy 爬虫的暂停与重启
  10. Spring Boot的日志配置
  11. laravel -查询近7月走势图案例
  12. Cesium调用 WMS 、WMTS 服务
  13. 无法找到“XXX.exe”的调试信息,或者调试信息不匹配。未使用调试信息生成二进制文件
  14. 009.MySQL-Keepalived搭配脚本03
  15. xcode修改默认头部注释(__MyCompanyName__) (转)
  16. 上产使用MQ的三点注意
  17. [UE4]UE4中的常见类
  18. 第八章 SQL高级处理 8-1 窗口函数
  19. tyvj 2075 借教室 题解
  20. 视图矩阵的推导-opengl应用

热门文章

  1. CSS实现水平垂直同时居中的6种思路
  2. Linux环境变量PATH
  3. Sublime Text3配置及控制台乱码[cmd杀死进程乱码/编译文件乱码]解决方法
  4. MT【191】阿波罗尼乌斯圆
  5. luogu2827 [NOIp2016]蚯蚓 (模拟)
  6. P2569 股票交易
  7. bzoj1345 序列问题
  8. myEclipse全局搜索时报错
  9. kindeditor上传图片的大小在哪控制
  10. VS 2010解决方案添加头文件和动态库