问加一条边,最少可以剩下几个桥。

先双连通分量缩点,形成一颗树,然后求树的直径,就是减少的桥。

本题要处理重边的情况。

如果本来就两条重边,不能算是桥。

还会爆栈,只能C++交,手动加栈了

别人都是用的双连通分量,我直接无向图改成有向图搞得强连通水过。

 #pragma comment(linker, "/STACK:1024000000,1024000000")
#include <iostream>
#include <vector>
#include <queue>
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
#include <stack> using namespace std;
const int maxn = ;
bool vis[];
struct edge
{
int v,next;
edge()
{
next = -;
}
}edges[maxn*-];
struct ed
{
int u,v;
}e[maxn*-];
int dfn[],low[],belong[];
bool inst[];
int g[maxn];
vector<int>ng[maxn]; stack<int>st;
int bcnt,cnt,time; void init(int n)
{
int i;
for(i =;i <= n;i++)
g[i] = -;
time = ;bcnt = cnt = ;
return ;
}
void addedge(int u,int v,int val)
{
struct edge o;
edges[cnt].v = v;
edges[cnt].next = g[u];
g[u] = cnt;
cnt++; return ;
}
void tarjan(int i)
{
int j;
dfn[i] = low[i] = ++time;
inst[i] = ;
st.push(i); for(j = g[i];j != -;j = edges[j].next)
{
if(vis[j]) continue;
vis[j] = vis[j^] = ;
int v;
v = edges[j].v;
if(!dfn[v])
{
tarjan(v);
low[i] = min(low[i],low[v]);
}
else if(inst[v])
low[i] = min(low[i],dfn[v]);
}
int k;
if(dfn[i] == low[i])
{ bcnt++;
do
{
k = st.top();
st.pop();
inst[k] = ;
belong[k] = bcnt; }
while(k != i);
} }
void tarjans(int n)
{
int i;
bcnt = time = ;
while(!st.empty())st.pop();
memset(dfn,,sizeof(dfn)); memset(inst,,sizeof(inst));
memset(belong,,sizeof(belong));
for(i = ;i <= n;i++)
if(!dfn[i])tarjan(i);
}
struct node
{
int s,point;
}; struct node bfs(int s)
{
int i;
for(i = ;i <= bcnt;i++)
vis[i] = ;
queue <struct node>q;
struct node p;
p.s = ;p.point = s;
q.push(p);
vis[s] = ;
struct node max;
max.s = ; while(!q.empty())
{
struct node now,temp;
now = q.front();
q.pop(); for(i = ;i < ng[now.point].size();i++)
{
int v = ng[now.point][i];
temp.s = now.s+;
temp.point = v;
if(!vis[v])
{
vis[v] = ;
// cout<<v<<"***"<<endl; if(max.s < temp.s)
max = temp;
q.push(temp);
}
}
}
return max;
}
int main()
{
int n,m;
//freopen("in.txt","r",stdin);
while(scanf("%d %d",&n,&m)&&(n||m))
{
int a,b,i;
init(n);
memset(vis,,sizeof(vis));
for(i = ;i < m;i++)
{
scanf("%d %d",&e[i].u,&e[i].v);
addedge(e[i].u,e[i].v,);
addedge(e[i].v,e[i].u,);
}
tarjans(n); for(i = ;i <= n;i++)
{
ng[i].clear();
} for(i = ;i < m;i++)
{
if(belong[e[i].u] == belong[e[i].v])
continue;
ng[belong[e[i].u]].push_back(belong[e[i].v]);
ng[belong[e[i].v]].push_back(belong[e[i].u]);
}
struct node max;
max = bfs();
max = bfs(max.point);
printf("%d\n",bcnt-max.s-);
}
return ;
}

4612 warm up tarjan+bfs求树的直径(重边的强连通通分量)忘了写了,今天总结想起来了。的更多相关文章

  1. HDU4612+Tarjan缩点+BFS求树的直径

    tarjan+缩点+树的直径题意:给出n个点和m条边的图,存在重边,问加一条边以后,剩下的桥的数量最少为多少.先tarjan缩点,再在这棵树上求直径.加的边即是连接这条直径的两端. /* tarjan ...

  2. [USACO2004][poj1985]Cow Marathon(2次bfs求树的直径)

    http://poj.org/problem?id=1985 题意:就是给你一颗树,求树的直径(即问哪两点之间的距离最长) 分析: 1.树形dp:只要考虑根节点和子节点的关系就可以了 2.两次bfs: ...

  3. 牛客小白月赛6C-桃花(DFS/BFS求树的直径)

    链接:https://www.nowcoder.com/acm/contest/136/C 来源:牛客网 桃花 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 262144K,其他语言 ...

  4. 两次bfs求树的直径的正确性

    结论:离树上任意点\(u\)最远的点一定是这颗树直径的一个端点. 证明: 若点\(u\)在树的直径上,设它与直径两个端点\(x,y\)的距离分别为\(S1\).\(S2\),若距离其最远的点\(v\) ...

  5. hdoj 4612 Warm up【双连通分量求桥&&缩点建新图求树的直径】

    Warm up Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65535/65535 K (Java/Others)Total Su ...

  6. (求树的直径)Warm up -- HDU -- 4612

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4612 给一个无向图, 加上一条边后,求桥至少有几个: 那我们加的那条边的两个顶点u,v:一定是u,v之 ...

  7. HDU-4612 Warm up,tarjan求桥缩点再求树的直径!注意重边

    Warm up 虽然网上题解这么多,感觉写下来并不是跟别人竞争访问量的,而是证明自己从前努力过,以后回头复习参考! 题意:n个点由m条无向边连接,求加一条边后桥的最少数量. 思路:如标题,tarjan ...

  8. 求树的直径+并查集(bfs,dfs都可以)hdu4514

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4514 这题主要是叫我们求出树的直径,在求树的直径之前要先判断一下有没有环 树的直径指的就是一棵树上面距 ...

  9. poj2631 求树的直径裸题

    题目链接:http://poj.org/problem?id=2631 题意:给出一棵树的两边结点以及权重,就这条路上的最长路. 思路:求实求树的直径. 这里给出树的直径的证明: 主要是利用了反证法: ...

随机推荐

  1. 【五】PHP数组操作函数

    1.输出数组的结构:bool print_r(数组); $arr=array('jack','mike','tom'); print_r($arr);//Array ( [0] => jack ...

  2. HBase Java简单示例--转载

    Hbase采用Java实现,原生客户端也是Java实现,其他语言需要通过thritf接口服务间接访问Hbase的数据. Hbase作为大数据存储数据库,其写能力非常强,加上Hbase本身就脱胎于Had ...

  3. codeforces 442C C. Artem and Array(有深度的模拟)

    题目 感谢JLGG的指导! 思路: //把数据转换成一条折线,发现有凸有凹 //有凹点,去掉并加上两边的最小值//无凹点,直接加上前(n-2)个的和(升序)//数据太大,要64位//判断凹与否,若一边 ...

  4. HDU 1978 How many ways(动态规划)

    How many ways http://acm.hdu.edu.cn/showproblem.php?pid=1978 Problem Description 这是一个简单的生存游戏,你控制一个机器 ...

  5. HDFS Protocol修改流程

        相对于1.x版本的Hadoop,2.x版本的Hadoop采用了Protocol Buffer作为序列化反序列化工具,以及RPC通讯工具.这样当我们对Hadoop源码进行修改之前,就需要了解Ha ...

  6. webmatrix

    http://www.microsoft.com/web/webmatrix/ WebMatrix is a free, lightweight, cloud-connected web develo ...

  7. java连接access数据库

    完整代码: package odbcj; import java.sql.Connection; import java.sql.DriverManager; import java.sql.Prep ...

  8. RTP-实时协议

    RTP,实时协议被用来为应用程序如音频,视频等的实时数据的传输提供端到端(end to end)的网络传输功能.传输的模型可以是单点传送或是多点传送.数据传输被一个姐妹协议——实时控制协议(RTCP) ...

  9. PHPStorm IDE 快捷键(MAC)

    ⌘——Command ⌃ ——Control ⌥——Option/Alt ⇧——Shift ⇪——Caps Lock fn——功能键就是fn 编辑 Command+alt+T 用 (if..else, ...

  10. iOS 解析手势识别(Gesture Recognizers)

    一.Gesture Recognizers Gesture Recognizers是在iOS3.2引入的,可以用来识别手势.简化定制视图事件处理的对象.Gesture Recognizers的基类为U ...