题目描述:

为了从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. AVL树、红黑树以及B树介绍

    简介 首先,说一下在数据结构中为什么要引入树这种结构,在我们上篇文章中介绍的数组与链表中,可以发现,数组适合查询这种静态操作(O(1)),不合适删除与插入这种动态操作(O(n)),而链表则是适合删除与 ...

  2. Redis之安装配置(Windows)

    下载 下载地址:https://github.com/MSOpenTech/redis/releases 解压,文件的名字重命名为redis. 打开文件夹,内容如下: 发送redis-server.e ...

  3. 正确理解IM长连接的心跳及重连机制,并动手实现(有完整IM源码)

    1.引言 说道“心跳”这个词大家都不陌生,当然不是指男女之间的心跳,而是和长连接相关的.顾名思义就是证明是否还活着的依据. 什么场景下需要心跳呢?目前我们接触到的大多是一些基于长连接的应用需要心跳来“ ...

  4. Bran的内核开发教程(bkerndev)-05 打印到屏幕

    打印到屏幕   现在, 我们需要尝试打印到屏幕上.为此, 我们需要管理屏幕滚动, 如果能允许使用不同的颜色就更好了.好在VGA视频卡为我们提供了一片内存空间, 允许同时写入属性字节和字符字节对, 可以 ...

  5. msf后门之persistence

    在获取得了meterpreter shell后 使用Persistence建立持续性后门 run persistence -h meterpreter > run persistence -h ...

  6. 基于STL的队列略解

    什么是STL 以下内容摘自这儿. STL(Standard Template Library,标准模板库)是惠普实验室开发的一系列软件的统称.它是由Alexander Stepanov.Meng Le ...

  7. php和apache的关系是什么?

    例如我们在自己的电脑里练习如何做网站的时候,我们需要搭建一个本地环境,这个本地环境就是PHP+APACHE + MYSQL的环境,这样就可以让我们的电脑拥有PHP要求的运行环境了.那么php和apac ...

  8. Maven -- 使用Myeclipse创建Maven项目

    使用Myeclipse创建Maven项目有如下几种方式: 1.创建Maven Java项目 1.1 选择新建Maven项目 1.2.选择创建简单项目 1.3.填写项目信息 1.4.创建成功后项目目录结 ...

  9. Spring Boot 配置 - 配置信息加密

    ▶ Spring Boot 依赖与配置 Maven 依赖 <dependency> <groupId>org.springframework.boot</groupId& ...

  10. 谜一样的Java编码和Windows编码

    本文适用于Java源码用UTF-8编码,平台系统为Windows的情况 不管是maven,还是javac,你的IDE都会带上一个参数:-Dfile.encoding=UTF-8 Windows(或许W ...