求在图中新建一条边后  剩下的最少的桥的数量。。
先tarjan求桥的数量。。然后缩点。。以连通分量为点建图  bfs求直径

最后用桥的数量减去直径即为答案

bfs求直径

https://www.cnblogs.com/WTSRUVF/p/9307517.html

#include <iostream>
#include <cstdio>
#include <cstring>
#include <queue>
#include <algorithm>
#include <vector>
#include <stack>
#define mem(a, b) memset(a, b, sizeof(a))
using namespace std;
const int maxn = , INF = 0x7fffffff;
int pre[maxn], low[maxn], sccno[maxn], d[maxn], head[maxn], vis[maxn*];
int dfs_clock, n, m, scc_cnt, bridge, maxway, pos;
stack<int> S;
int cnt1, cnt2;
struct edge
{
int u, v, next;
}Edge1[maxn*],Edge2[maxn*]; void add1(int u, int v)
{
Edge1[cnt1].u = u;
Edge1[cnt1].v = v;
Edge1[cnt1].next = head[u];
head[u] = cnt1++; }
void add2(int u, int v)
{
Edge2[cnt2].u = u;
Edge2[cnt2].v = v;
Edge2[cnt2].next = head[u];
head[u] = cnt2++;
} void init()
{
dfs_clock = ;
scc_cnt = ;
cnt1 = cnt2 = ;
bridge = ;
mem(pre, );
mem(vis, );
mem(low, );
mem(head, -);
mem(sccno, );
} void tarjan(int u)
{
pre[u] = low[u] = ++dfs_clock;
S.push(u);
for(int i=head[u]; i != -; i=Edge1[i].next)
{
int v = Edge1[i].v;
if(vis[i]) continue;
vis[i] = vis[i^] = ; // 标记同向边和反向边
if(!pre[v])
{
tarjan(v);
low[u] = min(low[v], low[u]);
}
else if(!sccno[v])
low[u] = min(low[u], pre[v]);
}
if(low[u] == pre[u])
{
scc_cnt++;
for(;;)
{
int x = S.top(); S.pop();
sccno[x] = scc_cnt;
if(x == u) break;
}
}
} void bfs(int u)
{
queue<int> Q;
mem(d, );
mem(vis, );
Q.push(u);
d[u] = ;
vis[u] = ;
maxway = , pos = u;
while(!Q.empty())
{
u = Q.front(); Q.pop();
for(int i=head[u]; i != -; i=Edge2[i].next)
{
int v = Edge2[i].v;
if(vis[v]) continue;
vis[v] = ;
d[v] = d[u] + ;
if(d[v] > maxway)
maxway = d[v], pos = v;
Q.push(v);
}
}
} int main()
{
while(~scanf("%d%d",&n, &m) && n+m)
{
init();
for(int i=; i<m; i++)
{
int u, v;
scanf("%d%d",&u, &v);
add1(u, v);
add1(v, u);
}
tarjan();
mem(head, -);
for(int i=;i < cnt1; i+=) //以连通分量建图 顺便求桥的数量
if(sccno[Edge1[i].u] != sccno[Edge1[i].v])
{
add2(sccno[Edge1[i].u], sccno[Edge1[i].v]);
add2(sccno[Edge1[i].v], sccno[Edge1[i].u]);
bridge++;
} bfs(sccno[]);
bfs(pos); printf("%d\n",bridge - maxway); } return ;
}

最新文章

  1. SEO技巧汇集
  2. linux系统安装配置
  3. 纯代码TableView自适应高度(很老的使用方法)
  4. [Tip] 如何在BeyondCompare中忽略不重要的区别.
  5. 关于WM_CTLCOLOREDIT的处理的一些问题
  6. JS给swf传参数
  7. Qt之QFileSystemWatcher
  8. hadoop2 作业执行过程之yarn调度执行
  9. Ajax乱码问题
  10. 【转】Nginx 服务器安装及配置文件详解
  11. python面向对象【初级篇】
  12. 转:更改 centos yum 源
  13. android shell常用命令
  14. UESTC - 1057 秋实大哥与花 线段树
  15. Spring有什么缺点?
  16. Allegro PCB Design GXL (legacy) 从dxf文件中导入板框
  17. ASP.NET WebAPI 集成 Swagger 启用 OAuth 2.0 配置问题
  18. 【代码笔记】Web-JavaScript-JavaScript输出
  19. Spark MLlib 之 aggregate和treeAggregate从原理到应用
  20. Android app widget中实现跑马灯效果(非widget部件也实用)

热门文章

  1. zabbix items 配置
  2. jqgrid 分页时,清空原表格数据加载返回的新数据
  3. golang postgresql CRUD
  4. odoo之ERP系统
  5. NYOJ 35 表达式求值
  6. docker 端口映射错误解决方法
  7. MySQL清理慢查询日志slow_log的方法
  8. helloworld讲解cocos2d-x的编程思路与要点
  9. HashMap 源码解析(一)之使用、构造以及计算容量
  10. 设计模式 笔记 状态模式 State