题目链接:https://www.luogu.org/problemnew/show/P2860

考虑在无向图上缩点。

运用到边双、桥的知识。

缩点后统计度为1的点。

度为1是有一条路径,度为2是有两条路径。

#include <stack>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
const int maxn = 300000 + 10;
struct edge{
int next, to, from;
}e[maxn<<2];
int head[maxn], cnt;
bool vis[maxn];
int n, m, u[maxn], v[maxn], d[maxn], ans;
stack<int> s;
int dfn[maxn], low[maxn], tim, color[maxn], num;
void add(int u, int v)
{
e[++cnt].from = u;
e[cnt].next = head[u];
e[cnt].to = v;
head[u] = cnt;
}
void tarjan(int x)
{
dfn[x] = low[x] = ++tim;
for(int i = head[x]; i != -1; i = e[i].next)
if(!vis[i])
{
int v = e[i].to;
if(dfn[v]) low[x] = min(low[x], dfn[v]);
else
{
s.push(v);
vis[i] = vis[(i&1)?i+1:i-1] = 1;
tarjan(v);
vis[i] = vis[(i&1)?i+1:i-1] = 0;
low[x] = min(low[x], low[v]);
}
}
if(dfn[x] == low[x])
{
num++;
while(!s.empty())
{
color[s.top()] = num;
if(s.top() == x) {
s.pop();
break;
}
s.pop();
}
}
}
int main()
{
memset(head, -1, sizeof(head));
scanf("%d%d",&n,&m);
for(int i = 1; i <= m; i++)
{
scanf("%d%d",&u[i],&v[i]);
add(u[i],v[i]); add(v[i],u[i]);
}
for(int i = 1; i <= n; i++)
if(!dfn[i]) num = 0, s.push(i), tarjan(i);
for(int i = 1; i <= m; i++)
{
if(color[u[i]] != color[v[i]])
d[color[u[i]]]++, d[color[v[i]]]++;
}
for(int i = 1; i <= n; i++) if(d[i] == 1) ans++;
printf("%d",(ans+1)/2);
return 0;
}

【luogu P2860 [USACO06JAN]冗余路径Redundant Paths】 题解的更多相关文章

  1. luogu P2860 [USACO06JAN]冗余路径Redundant Paths

    题目描述 In order to get from one of the F (1 <= F <= 5,000) grazing fields (which are numbered 1- ...

  2. luogu P2860 [USACO06JAN]冗余路径Redundant Paths |Tarjan

    题目描述 In order to get from one of the F (1 <= F <= 5,000) grazing fields (which are numbered 1. ...

  3. LUOGU P2860 [USACO06JAN]冗余路径Redundant Paths (双联通,缩点)

    传送门 解题思路 刚开始是找的桥,后来发现这样不对,因为一条链就可以被卡.后来想到应该缩点后找到度数为1 的点然后两两配对. #include<iostream> #include< ...

  4. 洛谷 P2860 [USACO06JAN]冗余路径Redundant Paths 解题报告

    P2860 [USACO06JAN]冗余路径Redundant Paths 题目描述 为了从F(1≤F≤5000)个草场中的一个走到另一个,贝茜和她的同伴们有时不得不路过一些她们讨厌的可怕的树.奶牛们 ...

  5. 洛谷P2860 [USACO06JAN]冗余路径Redundant Paths(tarjan求边双联通分量)

    题目描述 In order to get from one of the F (1 <= F <= 5,000) grazing fields (which are numbered 1. ...

  6. P2860 [USACO06JAN]冗余路径Redundant Paths tarjan

    题目链接 https://www.luogu.org/problemnew/show/P2860 思路 缩点,之后就成了个树一般的东西了 然后(叶子节点+1)/2就是答案,好像贪心的样子,lmc好像讲 ...

  7. 洛谷P2860 [USACO06JAN]冗余路径Redundant Paths

    题目描述 In order to get from one of the F (1 <= F <= 5,000) grazing fields (which are numbered 1. ...

  8. P2860 [USACO06JAN]冗余路径Redundant Paths

    题解: 首先要边双缩点这很显然 然后变成树上问题 发现dp,dfs好像不太对 考虑一下度数 发现只要在度数为1的点之间连边 但我好像不太会证明这个东西.. 网上也没有看到比较正确的证明方法和连边策略. ...

  9. 缩点【洛谷P2860】 [USACO06JAN]冗余路径Redundant Paths

    P2860 [USACO06JAN]冗余路径Redundant Paths 为了从F(1≤F≤5000)个草场中的一个走到另一个,贝茜和她的同伴们有时不得不路过一些她们讨厌的可怕的树.奶牛们已经厌倦了 ...

随机推荐

  1. JDBC的PreparedStatement启动事务使用批处理executeBatch()

    JDBC使用MySQL处理大数据的时候,自然而然的想到要使用批处理, 普通的执行过程是:每处理一条数据,就访问一次数据库: 而批处理是:累积到一定数量,再一次性提交到数据库,减少了与数据库的交互次数, ...

  2. Linux利器strace

    strace常用来跟踪进程执行时的系统调用和所接收的信号. 在Linux世界,进程不能直接访问硬件设备,当进程需要访问硬件设备(比如读取磁盘文件,接收网络数据等等)时,必须由用户态模式切换至内核态模式 ...

  3. CentOS 下 安装 JDK8

    1.下载 在 /usr/local 目录下创建目录 java # cd /usr/local # mkdir java 登录网址:http://www.oracle.com/technetwork/j ...

  4. jquery获取元素与屏幕高度距离

    a. onscroll事件 scroll是css样式中overflow的一个值,意思是显示滚动条;当一个元素的实际高度超过他的最大高度是,只要设置了overflow为scroll b. $(..).s ...

  5. 白话SpringCloud | 第八章:分布式配置中心的服务化及动态刷新

    前言 上一章节,简单介绍了分布式配置中心Spring Cloud Config的使用.同时,我们也遗漏了一些问题,比如如何配置实时生效,当服务端地址变更或者集群部署时,如何指定服务端地址?回想,在服务 ...

  6. MySQL之基本语句

    SQL是Structure Query language(结构化查询语言)的缩写,它是使用关系模型的数据库应用语言.在众多开源数据库中,MySQL正是其中最杰出的代表,MySQL是由三个瑞典人于20世 ...

  7. java线程的interrupt方法

    java现成的interrupt方法比较容易误导新手,它其实是不会中断(停止)当前的线程,只是标志一下当前线程的某个状态值(中断标志位),并且这个状态为只对阻塞方法(比如说:             ...

  8. Apache-Maven 的安装及配置

    一. 下载 没有 Maven 的朋友可以去 Apache 的官网下载一个 Maven, Apache-Maven 官网下载 : https://maven.apache.org/download.cg ...

  9. OpenLayers 3 实现轨迹回放

    function PathBack() { var PVLayer = new ol.layer.Vector({ source: new ol.source.Vector({}) }); var p ...

  10. 关于Java中的线程安全(线程同步)

    java中的线程安全是什么: 就是线程同步的意思,就是当一个程序对一个线程安全的方法或者语句进行访问的时候,其他的不能再对他进行操作了,必须等到这次访问结束以后才能对这个线程安全的方法进行访问 什么叫 ...