hdu 4612 Tarjan求桥数 + 求树的直径

本文介绍了一种高效算法,用于解决在一个有重边的无向连通图中,通过Tarjan缩点求解桥数,并在添加一条边后求得剩余最少桥数的问题。算法首先使用Tarjan算法进行缩点,将原图转化为树,再利用两次深度优先搜索(DFS)求得树的直径,最后计算出添加一条边后的最少桥数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题意:

一个有重边的无向连通图,添加一条边后最少剩几个桥。2  <= n <= 200000 , 1 <= m <= 1000000。

题解:

1.先用Tarjan缩点后求出桥数,然后原图就变成了一个树,对于一颗树,添加1条边后剩的最少桥数 = 总桥数 - 直径

树的桥数 = 边数。

2.2次dfs求树的直径:从任意点出发,求出距离该点最远的点pos ,再从pos出发,找到距离pos最远的点的距离ans。ans即为直径。无向图为了避免标记,传递参数时把父节点的序号标上。

3.用vector会MLE,所以需要用前向星。又因为是无向图且有重边,所以需要在前向星中加入flag。edge[i]遍历过后,反边不再遍历,即edge[i].flag = edge[i^1].flag = 0,第i条边和第i^1条边是互为反边。重边视为不同边

#include <bits/stdc++.h>
#define N 200005
#define M 1000005
#define inf 0x3f3f3f3f
#define mod 1000000007
using namespace std;
int n , m ;
int vis[N] ;
int low[N] ;
int dfn[N] ;
int s[N] ;
int id[N] ;
int top1 ;
int lay ;
int head[N] , head1[N] ;
int cnt ;
int tcc_num ;
int pos , ans ;
int bridge_num ;
int bridge[M][2] ;
struct Edge
{
    int to , next ;
    bool flag ;
} edge[M << 1] ;
void Tarjin(int u)
{
    int i , j , v ;
    lay ++ ;
    vis[u] = 1 ;
    low[u] = lay ;
    dfn[u] = lay ;
    s[++ top1] = u ;
    for(i = head[u] ; i != -1 ; i = edge[i].next)
    {
        if(!edge[i].flag)
           continue ;
        edge[i].flag = edge[i ^ 1].flag = 0 ;
        v = edge[i].to ;
        if(vis[v] == 0)
        {
          Tarjin(v) ;
          if(dfn[u] < low[v])
          {
                bridge_num ++ ;
                bridge[bridge_num][0] = u ;
                bridge[bridge_num][1] = v ;
          }
        }
        if(vis[v] == 1)
          low[u] = min(low[u] , low[v]) ;
    }
    if(low[u] == dfn[u])
    {
        tcc_num ++ ;
        while(s[top1] != u)
        {
            id[s[top1]] = tcc_num ;
            vis[s[top1]] = 2 ;
            top1 -- ;
        }
        id[s[top1]] = tcc_num ;
        vis[s[top1]] = 2 ;
        top1 -- ;
    }
}
int dfs(int u , int fa , int d)
{
    int i , j , v ;
    if(d > ans)
    {
        ans = d ;
        pos = u ;
    }
    for(i = head[u] ; i != -1 ; i = edge[i].next)
    {
        v = edge[i].to ;
        if(fa == v)
           continue ;
        dfs(v , u , d + 1) ;
    }
}
void cal()
{
    int i , j ;
    ans = 0 ;
    dfs(1 , 1 , 0) ;
    ans = 0 ;
    dfs(pos , pos , 0) ;
    printf("%d\n" , bridge_num - ans) ;
}
void addedge(int u , int v)
{
    edge[cnt].flag = 1 ;
    edge[cnt].to = id[v] ;
    edge[cnt].next = head[id[u]] ;
    head[id[u]] = cnt ++ ;
    edge[cnt].flag = 1 ;
    edge[cnt].to = id[u] ;
    edge[cnt].next = head[id[v]] ;
    head[id[v]] = cnt ++ ;
}
void change()
{
    int i , j ;
    cnt = 0 ;
    memset(head , -1 , sizeof(head)) ;
    for(i = 1 ; i <= bridge_num ; i ++)
       addedge(bridge[i][0] , bridge[i][1]) ;
}
int main()
{
    int i , j ;
    int u , v ;
    while(scanf("%d%d" , &n , &m) && !(n == 0 && m == 0))
    {
      cnt = 0 ;
      memset(vis , 0 , sizeof(vis)) ;
      memset(head , -1 , sizeof(head)) ;
      for(i = 1 ; i <= n ; i ++)
	      id[i] = i ; 
      for(i = 1 ; i <= m ; i ++)
      {
        scanf("%d%d" , &u , &v) ;
        addedge(u , v) ;
      }
      lay = top1 = 0 ;
      tcc_num = bridge_num = 0 ;
      Tarjin(1) ; //缩点
      change() ; //新建一个树
      cal() ;
    }
}

 

内容概要:本文深入探讨了Kotlin语言在函式编程和跨平台开发方面的特性和优势,结合详细的代码案例,展示了Kotlin的核心技巧和应用场景。文章首先介绍了高阶函和Lambda表达式的使用,解释了它们如何简化集合操作和回调函处理。接着,详细讲解了Kotlin Multiplatform(KMP)的实现方式,包括共享模块的创建和平台特定模块的配置,展示了如何通过共享业务逻辑代码提高开发效率。最后,文章总结了Kotlin在Android开发、跨平台移动开发、后端开发和Web开发中的应用场景,并展望了其未来发展趋势,指出Kotlin将继续在函式编程和跨平台开发领域不断完善和发展。; 适合人群:对函式编程和跨平台开发感兴趣的开发者,尤其是有一定编程基础的Kotlin初学者和中级开发者。; 使用场景及目标:①理解Kotlin中高阶函和Lambda表达式的使用方法及其在实际开发中的应用场景;②掌握Kotlin Multiplatform的实现方式,能够在多个平台上共享业务逻辑代码,提高开发效率;③了解Kotlin在不同开发领域的应用场景,为选择合适的技术栈提供参考。; 其他说明:本文不仅提供了理论知识,还结合了大量代码案例,帮助读者更好地理解和实践Kotlin的函式编程特性和跨平台开发能力。建议读者在学习过程中动手实践代码案例,以加深理解和掌握。
内容概要:本文深入探讨了利用历史速度命令(HVC)增强仿射编队机动控制性能的方法。论文提出了HVC在仿射编队控制中的潜在价值,通过全面评估HVC对系统的影响,提出了易于测试的稳定性条件,并给出了延迟参与跟踪误差关系的显式不等式。研究为两轮差动机器人(TWDRs)群提供了系统的协调编队机动控制方案,并通过9台TWDRs的仿真和实验验证了稳定性和综合性能改进。此外,文中还提供了详细的Python代码实现,涵盖仿射编队控制类、HVC增强、稳定性条件检查以及仿真实验。代码不仅实现了论文的核心思想,还扩展了邻居历史信息利用、动态拓扑优化和自适应控制等性能提升策略,更全面地反映了群体智能协作和性能优化思想。 适用人群:具备一定编程基础,对群体智能、机器人编队控制、时滞系统稳定性分析感兴趣的科研人员和工程师。 使用场景及目标:①理解HVC在仿射编队控制中的应用及其对系统性能的提升;②掌握仿射编队控制的具体实现方法,包括控制器设计、稳定性分析和仿真实验;③学习如何通过引入历史信息(如HVC)来优化群体智能系统的性能;④探索中性型时滞系统的稳定性条件及其在实际系统中的应用。 其他说明:此资源不仅提供了理论分析,还包括完整的Python代码实现,帮助读者从理论到实践全面掌握仿射编队控制技术。代码结构清晰,涵盖了从初始化配置、控制律设计到性能评估的各个环节,并提供了丰富的可视化工具,便于理解和分析系统性能。通过阅读和实践,读者可以深入了解HVC增强仿射编队控制的工作原理及其实际应用效果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值