洛谷P2860 [USACO06JAN]Redundant Paths G (tarjan,边双缩点)
本题的大意就是加最少的边使得图成为边双。
多举例子,画图分析可得:最终答案就是叶子节点(度数为1的点)的个数加1在除以2。
那么我们的目的就转化为找叶子节点:
首先通过tarjan找到割边,再dfs将原图分为几个边双(通过割边划分),缩点,最后统计度数为1的节点个数即可。
1 #include<bits/stdc++.h>
2 using namespace std;
3 const int N=100100;
4 int n,m,ans,tot=1,cnt,sum;
5 int dfn[N],low[N];
6 int head[N],to[N],nxt[N];
7 int num[N],du[N],way[N];//way[]用来统计割边
8
9 void add(int u,int v){//tot从2开始,方便通过异或找反向边
10 nxt[++tot]=head[u];
11 head[u]=tot;
12 to[tot]=v;
13 }
14
15 void tarjan(int u,int fa){//fa是u的父亲边,该函数目的是为了找割边,不需要栈
16 low[u]=dfn[u]=++cnt;
17 for(int i=head[u];i;i=nxt[i]){
18 int v=to[i];
19 if(!dfn[v]){
20 tarjan(v,i);
21 low[u]=min(low[u],low[v]);
22 if(low[v]>dfn[u]) way[i]=way[i^1]=1;//i及其反向边是割边
23 }
24 else if(fa!=(i^1)) low[u]=min(low[u],dfn[v]);
25 }
26 }
27
28 void dfs(int u){
29 num[u]=sum;
30 for(int i=head[u];i;i=nxt[i]){
31 if(way[i]||num[to[i]]) continue;//u是割边或者对面点已经属于另外的连通块
32 dfs(to[i]);
33 }
34 }
35
36 int main(){
37 scanf("%d%d",&n,&m);
38 while(m--){
39 int x,y;
40 scanf("%d%d",&x,&y);
41 add(x,y);add(y,x);
42 }
43 tarjan(1,0);//0是1的父亲边
44 for(int i=1;i<=n;i++)
45 if(!num[i]) {sum++;dfs(i);}//sum统计连通块的个数
46 for(int i=1;i<=n;i++)
47 for(int j=head[i];j;j=nxt[j])
48 if(num[i]!=num[to[j]]) du[num[to[j]]]++;
49 for(int i=1;i<=sum;i++)
50 if(du[i]==1) ans++; //求度数为1的叶子节点
51 cout<<(ans+1)/2<<endl;
52 return 0;
53 }
洛谷P2860 [USACO06JAN]Redundant Paths G (tarjan,边双缩点)的更多相关文章
- 洛谷 P2860 [USACO06JAN]冗余路径Redundant Paths 解题报告
P2860 [USACO06JAN]冗余路径Redundant Paths 题目描述 为了从F(1≤F≤5000)个草场中的一个走到另一个,贝茜和她的同伴们有时不得不路过一些她们讨厌的可怕的树.奶牛们 ...
- POJ 3177 Redundant Paths (tarjan边双连通分量)
题目连接:http://poj.org/problem?id=3177 题目大意是给定一些牧场,牧场和牧场之间可能存在道路相连,要求从一个牧场到另一个牧场要有至少两条以上不同的路径,且路径的每条pat ...
- 洛谷P2860 [USACO06JAN]冗余路径Redundant Paths(tarjan求边双联通分量)
题目描述 In order to get from one of the F (1 <= F <= 5,000) grazing fields (which are numbered 1. ...
- 洛谷P2860 [USACO06JAN]冗余路径Redundant Paths
题目描述 In order to get from one of the F (1 <= F <= 5,000) grazing fields (which are numbered 1. ...
- POJ3177 Redundant Paths【tarjan边双联通分量】
LINK 题目大意 给你一个有重边的无向图图,问你最少连接多少条边可以使得整个图双联通 思路 就是个边双的模板 注意判重边的时候只对父亲节点需要考虑 你就dfs的时候记录一下出现了多少条连向父亲的边就 ...
- poj 3177 Redundant Paths(tarjan边双连通)
题目链接:http://poj.org/problem?id=3177 题意:求最少加几条边使得没对点都有至少两条路互通. 题解:边双连通顾名思义,可以先求一下连通块显然连通块里的点都是双连通的,然后 ...
- 【洛谷5008】逛庭院(Tarjan,贪心)
[洛谷5008]逛庭院(Tarjan,贪心) 题面 洛谷 题解 如果图是一个\(DAG\),我们可以任意选择若干个不是入度为\(0\)的点,然后把它们按照拓扑序倒序删掉,不难证明这样一定是合法的. 现 ...
- 洛谷 P2194 HXY烧情侣【Tarjan缩点】 分析+题解代码
洛谷 P2194 HXY烧情侣[Tarjan缩点] 分析+题解代码 题目描述: 众所周知,HXY已经加入了FFF团.现在她要开始喜(sang)闻(xin)乐(bing)见(kuang)地烧情侣了.这里 ...
- 洛谷1726 上白泽慧音 tarjan模板
题目描述 在幻想乡,上白泽慧音是以知识渊博闻名的老师.春雪异变导致人间之里的很多道路都被大雪堵塞,使有的学生不能顺利地到达慧音所在的村庄.因此慧音决定换一个能够聚集最多人数的村庄作为新的教学地点.人间 ...
随机推荐
- 「游戏引擎 浅入浅出」4.1 Unity Shader和OpenGL Shader
「游戏引擎 浅入浅出」从零编写游戏引擎教程,是一本开源电子书,PDF/随书代码/资源下载: https://github.com/ThisisGame/cpp-game-engine-book 4.1 ...
- python主动杀死线程
简介 在一些项目中,为了防止影响主进程都会在执行一些耗时动作时采取多线程的方式,但是在开启线程后往往我们会需要快速的停止某个线程的动作,因此就需要进行强杀线程,下面将介绍两种杀死线程的方式. 直接强杀 ...
- 关于标准IO缓冲区的问题
关于标准IO缓冲区的问题 按照标准IO缓冲区可以分为三类: 不缓存类型: 一旦有数据,直接将数据写入到文件 行缓冲类型: 同全缓冲类型 遇到\n时,将数据写入文件 全缓冲类型: 当程序结束,将数据冲洗 ...
- [算法1-排序](.NET源码学习)& LINQ & Lambda
[算法1-排序](.NET源码学习)& LINQ & Lambda 说起排序算法,在日常实际开发中我们基本不在意这些事情,有API不用不是没事找事嘛.但必要的基础还是需要了解掌握. 排 ...
- 052_末晨曦Vue技术_处理边界情况之程序化的事件侦听器
程序化的事件侦听器 点击打开视频讲解更详细 现在,你已经知道了 $emit 的用法,它可以被 v-on 侦听,但是 Vue 实例同时在其事件接口中提供了其它的方法.我们可以: 通过 $on(event ...
- Word修订内容批量标红
最近改文章,期刊要求提供所有修改内容都标红的修订稿,本着能不手改就不手改的原则,我尝试检索了一下自动修改的方法,最先找到的是简书上的一篇使用VB宏命令批量修改的文章 (Word-接受全部修订为标红字体 ...
- 探秘:TriCore处理器中断机制
1. TriCore与中断的简介 TriCore是德国英飞凌科技公司旗下的第一个为实时嵌入式系统而优化的统一的.32位的微控制器-DSP(Digital Signal Processing)处理器架构 ...
- 文件分享工具ShareLocalFile不需要云盘的实时上传下载文件的云盘工具可以搜索整个网络的文件
工具的下载地址:https://comm.zhaimaojun.cn/AllSources/ToolDetail/?tid=9693 这是一个未来的项目,可以分享我们的文件,目前由于个人的技术水平限制 ...
- 【碳硫磷模拟赛】消失的+和* (树形DP)
好久没做过这么恶心的DP题了 题面 题面很简单,有一个计算式,由+号.*号.括号和小于10的正整数组成,现在所有的+和*(由于属于违禁词而)都被-号给和谐掉了,现在要求所有可能的原计算式的结果之和. ...
- 这三大特性,让 G1 取代了 CMS!
大家好,我是树哥. 之前我们聊过 CMS 回收器,但那时候我们说 CMS 回收器已经落伍了,现在应该是用 G1 回收器的时候了.那么 G1 回收器到底有什么魔力,它比 CMS 回收器相比强在哪里呢?今 ...