题目描述:

为了从F(1≤F≤5000)个草场中的一个走到另一个,贝茜和她的同伴们有时不得不路过一些她们讨厌的可怕的树.奶牛们已经厌倦了被迫走某一条路,所以她们想建一些新路,使每一对草场之间都会至少有两条相互分离的路径,这样她们就有多一些选择.

每对草场之间已经有至少一条路径.给出所有R(F-1≤R≤10000)条双向路的描述,每条路连接了两个不同的草场,请计算最少的新建道路的数量, 路径由若干道路首尾相连而成.两条路径相互分离,是指两条路径没有一条重合的道路.但是,两条分离的路径上可以有一些相同的草场. 对于同一对草场之间,可能已经有两条不同的道路,你也可以在它们之间再建一条道路,作为另一条不同的道路.

简单说,就是加多少条边可以让所有点都在环上(不一定是一个环)

题解:

边双联通:删掉一条边,图仍旧联通。于是乎:

这不就是题面的意思吗?!

模板题???

于是思路非常明确:tarjan完之后硬跑即可。

怎么硬跑呢?把所有的边双给找出来,缩成一个联通块,然后把点之间的边转化为联通块之间的边,这样,只要统计度为1的联通快,答案就get了。

把所有已有的环给缩起来,然后再找多少入度为1的点,加边肯定是给他们两两相连,达到最优

为什么嘞?

首先,在度为大于1的点上加边,找到的环不是最大环,就导致原本可以一条边解决的事被分了多次解决,于是只对度为1的点,把他们两两相连,统计出的数量即为答案。

于是,整个题目就很明朗了:

技巧:

1、因为是无向图,每两个点就构成了一个环,所有有一个神一般的操作:^1

2^1=3,3^1=2;4^1=5,5^1=4....

因为两个正反边是在一起存的,所以搜到一个边,然后用异或操作,就可以搞到下一条边得下标了,把它们都打上vis标记,就可以跑有向图了。

坑点:

1、因为有异或操作,所以1的话异或起来会是0,于是就跑不到了,所有cnt要初始化为1.....

2、如果ans是奇数,在/2的过程中,可能会损失精度,所有+1/2......

3、没了.....

代码:

#include<bits/stdc++.h>
using namespace std;
const int maxn=;
struct edge
{
int to,next;
}e[maxn<<];
int n,m,ans;
int head[maxn<<],cnt=;
int x[maxn],y[maxn];
inline void addedge(int from,int to)
{
e[++cnt].next=head[from];
e[cnt].to=to;
head[from]=cnt;
}
int dfn[maxn],low[maxn],tot,vis[maxn],top;
int st[maxn],color[maxn],col;
int ru[maxn];
void tarjan(int u)
{
dfn[u]=low[u]=++tot;
st[++top]=u;
for(int i=head[u];i;i=e[i].next)
{
int v=e[i].to;
if(!vis[i])
{
vis[i]=vis[i^]=;
if(dfn[v]==)
{
tarjan(v);
low[u]=min(low[u],low[v]);
}
else
{
low[u]=min(low[u],dfn[v]);
}
}
}
if(dfn[u]==low[u])
{
color[u]=++col;
while(st[top]!=u)
color[st[top]]=col,top--;
top--;
}
}
int main()
{
scanf("%d%d",&n,&m);//n=read();m=read();
for(int i=;i<=m;i++)
{
scanf("%d%d",&x[i],&y[i]);//x[i]=read();y[i]=read();
addedge(x[i],y[i]);
addedge(y[i],x[i]);
} for(int i=;i<=n;i++)
{
if(!dfn[i])
tarjan(i);
} for(int i=;i<=m;i++)
if(color[x[i]]!=color[y[i]])
ru[color[x[i]]]++,ru[color[y[i]]]++; for(int i=;i<=col;i++)
if(ru[i]==)
ans++; printf("%d\n",ans+>>);
return ;
}

( zrxdl %%%)

(完)

P2860()的更多相关文章

  1. 以下C#程序的输出结果是( )。

    以下程序的输出结果是( ). using System; namespace HoverTreeTikuConsole { class Program { static void Main(strin ...

  2. PHP 位运算(&, |, ^, ~, <<, >>)及 PHP错误级别报告设置(error_reporting) 详解

    位运算符允许对整型数中指定的位进行求值和操作. 位运算符 例子 名称 结果 $a & $b And(按位与) 将把 $a 和 $b 中都为 1 的位设为 1. $a | $b Or(按位或) ...

  3. 页面加载完成后,触发事件——trigger()

    <button id="btn">点击我</button> <div id="test"></div> 如果页面 ...

  4. linux/unix 编程手册 fork()函数

    父进程通过fork()函数创建子进程,将父进程数据段和栈的内容拷贝到子进程中,子进程执行程序execve创建新程序,调用exit函数退出到等待wait(),挂起父进程, 父子进程享用相同的程序文本段. ...

  5. setInterval()与clearInterval()的一个有趣小现象

    今天在使用setInterval()时,发现了一个有意思的事情 代码如下: var box=document.getElementById("box");//获取id为“box”的 ...

  6. HTML DOM对象之createElement()方法

    今天在学习DOM节点操作时,发现了创建DOM节点的createElement()方法的一个有意思的现象. 代码如下: var box=document.getElementById("box ...

  7. join()方法之我见

    JavaScript join() 方法 定义和用法 join() 方法用于把数组中的所有元素放入一个字符串. 元素是通过指定的分隔符进行分隔的. 语法 arrayObject.join(separa ...

  8. 转义字符(\)对JavaScript中JSON.parse的影响概述

    JSON是一个提供了stringify和parse方法的内置对象,前者用于将js对象转化为符合json标准的字符串,后者将符合json标准的字符串转化为js对象,本文为大家介绍下转义字符对JSON.p ...

  9. 14、java中的equals()和toString()方法

    /* 所有对象的父类Object Object中的方法: equals() 对象是否相同的比较方法 toString()对象的字符串表现形式 */ class Person { String name ...

随机推荐

  1. Tomcat部署项目的三个方法

    所需软件安装 要想在Tomcat中部署项目前提是先要搭建好Tomcat,搭建Tomcat就离不开以下软件包的安装配置,本次演示使用Linux平台 1.JDK软件包 JDK是一切java应用程序的基础, ...

  2. MQ相关面试题

    如果你的简历中有写到MQ,那么面试官一般会问到如下几个问题,至少我在面试中经常常被问到,所以今天总结一下,有不对的地方还望多多包涵: 首先第一个问题,为什么要用MQ? 如果这个问题你都没考虑过,那么说 ...

  3. Have a Good Attitude 良好的态度

    Poor attitudes lead to poor communication. Poor communication leads to poor service. Poor service le ...

  4. springboot配置logback日志

    springboot配置logback日志 java web 下有好几种日志框架,比如:logback,log4j,log4j2(slj4f 并不是一种日志框架,它相当于定义了规范,实现了这个规范的日 ...

  5. Python多线程多进程那些事儿看这篇就够了~~

    自己以前也写过多线程,发现都是零零碎碎,这篇写写详细点,填一下GIL和Python多线程多进程的坑~ 总结下GIL的坑和python多线程多进程分别应用场景(IO密集.计算密集)以及具体实现的代码模块 ...

  6. AWD攻防工具脚本汇总(一)

    最近工作很忙 今天抽空准备下AWD比赛得攻防工具和脚本 以下只是常用 希望下周不被吊锤~~ 后续整理后想抽空写成一个攻击框架汇总放github~~ 这里从各种情景和需求中去总结工具和脚本的使用   情 ...

  7. 常用windows命令

    目录 本教程概述 用到的工具 标签 简介 1.cmd的一些规则 2.cd切换目录命令 3.dir显示目录命令 4.type显示文本内容 5.del 删除文件 6.查看IP地址 7.net 命令 8.n ...

  8. VBS 去除文件夹下 Excel 的公式

    注意问题 window 环境下运行, 代码 ANSI 编码格式保存. 直接放到需要转换的文件夹下,双击运行. 代码 function getfolder() getfolder=left(wscrip ...

  9. 网站开发常用Sql语句

    维护网站,经常操作数据库,使用sql语句可以达到事半功倍的效果.比如,把所有密码为空的教师初始设成id一致,sql语句比手动快万倍. 下面介绍数据库开发中经常用到的一些sql语句: 一 建库操作 1. ...

  10. cmd 获取当前登录的用户和远程连接的用户

    打开cmd  执行  quser 可以看到我有两个 会话 带>  是我当前的会话 rdp 是远程连接的会话   console 是本机操作  可以知道谁在连接你 状态是  唱片 就是未连接的意思 ...