CF732F Tourist Reform[边双缩点]】的更多相关文章

题意:给无向图每一条边定向,使得每个点可达点数$R_i$最小值尽可能大,求方案. 条件反射想到二分答案,然后看怎么检验,发现要让所有点$R_i$大于等于某一个值,首先我们关注某些特殊的子图:如果有环的话,显然可以让他定向后各点互达,并且这样的定向并不会影响其他点的$R$.进一步看,如果一个子图,定向后成了一个SCC,显然每个点都可以到达所有子图内的点,显然是很好的.而SCC对应在无向图中,是一个边双,并且因为边双可以看成是一堆环互相套和交组成的连通图,相当于每个环都定一下向,所以显然直接dfs,…
题目:http://codeforces.com/contest/732/problem/F 首先把边双缩点,边双内部 dfs 一个顺序一定是可以从每个点走到边双内部所有点的,因为它是以环为基本单位: 然后对于缩点之后的图,找到 siz 最大的点作为根 dfs,再连反边,那么只有 siz 最大的那个点只能走到自己内部,就可以使答案最大: 结构体要开得精细一点,防止爆空间?还是什么奇奇怪怪的错误之类的... 代码如下: #include<iostream> #include<cstdio&…
题意 在一张有向图中,设 ri 为从点 i 出发能够到达的点的数量. 定义有向图的“改良值”为 ri 的最小值. 现给出一张无向图,要求给每条边定一个方向,使产生的有向图“改良值”最大. 输出 最大改良值和边的方向. n,m≤400000 题解 对于无向图的每个“边双连通分量”,一定存在一种定向方法,使其改良值等于其大小 把无向图缩点后,以最大的 e-DCC 为零出度点(终点) BFS 定向 每个 e-DCC 内部 DFS 定向 #include<iostream> #include<c…
题意:n个点,m条无向边,每个边有权值,给你 s 和 t,问你至多删除两条边,让s,t不连通,问方案的权值和最小为多少,并且输出删的边 分析:n<=1000,m是30000  s,t有4种情况(首先定义完全不相同的路径,即两条路径上没有一条边是一样的) 1. s,t本就不连通,输出0即可 2. s,t连通但是只有一条完全不相同的路径 3. s,t连通但是只有两条条完全不相同的路径 4. s,t连通但是有>=3条完全不相同的路径(这种情况无解) 情况1预处理即可,要解决的问题是2,3,4乍一看,…
辣鸡错误:把dfs和ldfs搞混...QAQ 题意:给定一个无向图,然后查询q次,求每次查询就在图上增加一条边,求剩余割边的个数. 先把边双缩点,然后预处理出LCA的倍增数组: 然后加边时,从u往上跳,把所有u到LCA(u,v)路径上割边去掉,即 --ans:v同理: 而向上跳的时候可以用并查集,把已经去掉的边,用路径压缩忽略掉,会往上跳的更快些. memset记得写全,不然.. #include<cstdio> #include<iostream> #include<cma…
给你一个图和三个点U,V,W  问你是否存在从U到V和从U到W的两条边不相交路径 先边双缩点 再每个连通分量搞LCA 最后LCA判 #include<bits/stdc++.h> using namespace std; #define INF 0xfffffff #define maxn 200025 #define min(a,b) (a<b?a:b) int m, n, Time, cnt, top; int dfn[maxn], block[maxn], low[maxn], F…
一道比较简单的 关于边双的题,个人感觉难度不大. 求出整个图的边双,根据边双的定义我们可以延伸出 边双的任两个点都有至少两种路径来互相抵达(因为其不存在割边) .不妨将每个边双缩成一个点,样例中的图便变成了一棵树: 为什么呢?因为缩了点之后的图如果存在环,这个环便又可以构成一个边双了. 我们发现只要 将所有的叶子节点(度为1)的节点连起来,整个图便就构成了一个边双.那么我们的做法就很明确了,选取一个度不为1的点作为根,统计度为1的节点的数量n,答案便是(n+1)/2. #include <ios…
// CF 732F Tourist Reform // 思路:两遍tarjan // 找强联通分量 #include <bits/stdc++.h> using namespace std; #define LL long long typedef pair<int,int> pii; const int inf = 0x3f3f3f3f; ; #define clc(a,b) memset(a,b,sizeof(a)) ; ; void fre() {freopen("…
题目链接:http://codeforces.com/problemset/problem/732/F 题意: 给出一个有n个点m条边的无向图,保证联通,现在要求将所有边给定一个方向使其变成有向图,设f(x)为点x能到达的点的个数,要求使最小的f(x)最大,并输出方案. 思路: tarjan一下,答案肯定是强连通分量里点最多的一个分量,而同一个强连通里的点成环,其他分量都指向这个最大点个数的分量. 退役了,偶尔刷一下题... #include <bits/stdc++.h> using nam…
这个题当时打多校的时候有思路,但是代码能力差,没有写出来 事后看zimpha巨巨的题解,看了觉得基本差不多 核心思路:就是找出割点,然后变成森林,然后树形dp就可以搞了 关键就在重新构图上,缩完点以后,一个割点至少在两个点双里面,这个时候 把割点拿出来,分别和点双连边,也就是说,缩完的点双是不包含割点的,这个可以人为搞一下 (像有的点双里面只包含一个桥边,如果把割点拿出来,点双里面没有点了,这个时候把点双的权值积设为1就好) 然后说是树形dp,其实就是逆元搞一搞,这个很简单,树形dp只处理割点的…
边双连通分量. 这题有一点构造的味道.一个有向图,经过强连通缩点之后会形成一个有向无环图. 如果将最大的强连通分量放在顶端,其余的强连通分量都直接或间接指向他,那么这样就构造出了符合要求的图. 接下来就是要去寻找强连通分量.对于一个无向图来说,每一个边-双联通分量都可以将每条边定向之后构造成一个强连通分量,$dfs$一遍即可. #pragma comment(linker, "/STACK:1024000000,1024000000") #include<cstdio> #…
题目链接 lueluelue 分析 这鬼题卡了我10发提交,之前做过一道类似的题目:https://rye-catcher.github.io/2018/07/09/luogu%E9%A2%98%E8%A7%A3P2860-USACO%E5%86%97%E6%9D%82%E8%B7%AF%E5%BE%84-%E7%BC%A9%E7%82%B9-%E6%A1%A5/ 危险的边就是桥边,Tarjan求出边双后缩点整个图变成树,树边都是危险的边,我们需要加一条边构成一个新的ecc使危险的边最小 于是一…
首先同一个点双内部的加边肯定不影响..所以先缩点成树,然后每次加一条边,这条对应的树上路径上所有边就都不是桥了,且每次操作独立作用,不相互影响(不过有可能本来一条边已经不是桥了又被标记了一次),所以每次相当对树链做一次链覆盖,统计未覆盖边.这个是链剖板子..$O(N\log^2N)$ #include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #include<cm…
本题的大意就是加最少的边使得图成为边双. 多举例子,画图分析可得:最终答案就是叶子节点(度数为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]…
前言:关于如何求双连通分量,我们可以在tarjan搜索时标记下所有桥的位置(双连通分量(可以认为是没有桥的无向图图)即可通过删去所有桥得到),那么怎么找桥呢,对于每一条搜索到的边u->x,如果low[u]>dfn[x]则说明u不能通过子图到达比x更早的节点,那么就说明该边是桥 题意:把一个无向图变成有向图,对于这个有向图来说,每个点的价值是它所有能到达的点的数量,要求使得所有点中最小的价值最大 题解:现学的边-双联通分量,先求一遍边-双联通分量,然后在每个双连通分量里dfs一边把双向边变成单向…
求出无向图的所有边双联通分量,然后缩点就成了一颗树. 然后我们选取最大的那个边双联通分量作为根,这样我们就可以确定所有割边的方向了. 对于边双联通分量里面的边,我们随便dfs一下就可以把它变成强连通分量,方向也就确定了. #include <bits/stdc++.h> using namespace std; vector<]; vector<pair<]; set<pair<int, int>> bridge; set<pair<int…
[题目链接]:http://codeforces.com/contest/732/problem/F [题意] 给你一张无向图; n个点,m条边; 让你把这张图改成有向边 然后定义r[i]为每个点能够到达的其他点的数目; 让你使得最小的r[i]尽可能地大; 让你输出这个尽可能大的最小的ri; 然后输出改边之后的有向图; [题解] 如果整张图是一个环的话; 这个环上的每个点的答案就是确定的; 即为这个环的大小; 则考虑把原图缩点; 缩点之后; 每个环都能成为一个点; 则最后的答案就是强连通分量中所…
题目:http://codeforces.com/contest/732/problem/F 给无向图定向使得从每个点出发能去的点数最小值最大. SCC.点内部dfs定向.点间以siz最大的为起点反向dfs. 自我感觉良好的自己写法:在新连边的时候只是操作一下 thd 和 tnxt 即可. 注意写了构造函数的话结构体成员的初值就不是自动赋值为0了. #include<iostream> #include<cstdio> #include<cstring> using n…
题意:一个连通无向图,问你增加一条边后,让原图桥边最少 分析:先边双缩点,因为连通,所以消环变树,每一个树边都是桥,现在让你增加一条边,让桥变少(即形成环) 所以我们选择一条树上最长的路径,连接两端,这样减少的桥边,最多,所以就是求树的直径 注:这题有重边,所以边双缩点也需要用重边版的 #include <stdio.h> #include <string.h> #include <algorithm> #include <math.h> #include…
分析:边双缩点后,消环变树,然后答案就是所有叶子结点(即度为1的点)相连,为(sum+1)/2; 注:此题有坑,踩踩更健康,普通边双缩短默认没有无向图没有重边,但是这道题是有的 我们看,low数组是我们缩点的关键,记录最早的前驱,但是不能由父边过来,这是因为没有重边 当有重边时,父边也可以更新low数组,所以我们只需要忽略父边第一次出现,这样第二次出现时,就可以用了 这样就完美解决了重边问题 #include <stdio.h> #include <string.h> #inclu…
题意:n个点,m条边的无向图,有的边上有标记,每条边只能走一次 给你一个起点,一个终点,询问是否能找到从起点到终点的路径,这条路径至少包含一条含有标记的边 分析:然后边双缩点 下面介绍一下边双的性质 1,删掉边双内任意一条边,不影响边双的连通性 2,任取边双内两个点u,v,对于边双里面的任意一条边,至少包含于一条u到v的路径 所以对于这个题,可以运用上述的第二个性质,对于在边双里的标记边,都是可以经过的 然后缩点以后,变成一棵树,然后从起点所在的边双开始遍历,找到到终点所在边双的路径,询问权值是…
记得有个梗那一天,zw学生zzh大佬说逃不掉的路变成a不掉的题哈哈哈哈: 分离的路径: BZOJ 1718POJ 3177LUOGU 286: 思路:在同一个边双连通分量中,任意两点都有至少两条独立路可达,所以同一个边双连通分量里的所有点可以看做同一个点.缩点后,新图是一棵树,树的边就是原无向图的桥. 现在问题转化为:在树中至少添加多少条边能使图变为双连通图.结论:添加边数=(树中度为1的节点数+1)/2: 具体方法为,首先把两个最近公共祖先最远的两个叶节点之间连接一条边,这样可以把这两个点到祖…
题目描述 在遥远的S星系中一共有N个星球,编号为1…N.其中的一些星球决定组成联盟,以方便相互间的交流.但是,组成 联盟的首要条件就是交通条件.初始时,在这N个星球间有M条太空隧道.每条太空隧道连接两个星球,使得它们能 够相互到达.若两个星球属于同一个联盟,则必须存在一条环形线路经过这两个星球,即两个星球间存在两条没有 公共隧道的路径.为了壮大联盟的队伍,这些星球将建设P条新的太空隧道.这P条新隧道将按顺序依次建成.一条 新轨道建成后,可能会使一些星球属于同一个联盟.你的任务是计算出,在一条新隧…
题目描述 某校开展了同学们喜闻乐见的阳光长跑活动.为了能“为祖国健康工作五十年”,同学们纷纷离开寝室,离开教室,离开实验室,到操场参加3000米长跑运动.一时间操场上熙熙攘攘,摩肩接踵,盛况空前. 为了让同学们更好地监督自己,学校推行了刷卡机制. 学校中有n个地点,用1到n的整数表示,每个地点设有若干个刷卡机. 有以下三类事件: 1.修建了一条连接A地点和B地点的跑道. 2.A点的刷卡机台数变为了B. 3.进行了一次长跑.问一个同学从A出发,最后到达B最多可以刷卡多少次.具体的要求如下: 当同学…
http://poj.org/problem?id=3177 这个妹妹我大概也曾见过的~~~我似乎还没写过双联通分量的blog,真是智障. 最少需要添多少条边才能使这个图没有割边. 边双缩点后图变成一棵树,( 树上度数为1的点的数目+1 ) / 2就是答案. 注意: 1.直接缩成一个点的时候特判一下(不需要加边). 2.找割边同时用栈缩点的话要注意需要缩成一个点的是割边后面所有的点,能缩的时候直接判断末尾有没有到当前点就完事了,如果判断low来找割边后面所有的点是不准确的. #include<i…
LINK 经典傻逼套路 就是把所有边双缩点之后叶子节点的个数 //Author: dream_maker #include<bits/stdc++.h> using namespace std; //---------------------------------------------- //typename typedef long long ll; //convenient for #define fu(a, b, c) for (int a = b; a <= c; ++a)…
Description In order to get from one of the F (1 <= F <= 5,000) grazing fields (which are numbered 1..F) to another field, Bessie and the rest of the herd are forced to cross near the Tree of Rotten Apples. The cows are now tired of often being forc…
建补图,是两个不仇恨的骑士连边,如果有环,则可以凑成一桌和谐的打麻将 不能直接缩点,因为直接缩点求的是连通分量,点双缩点只是把环缩起来 普通缩点                                                                                               点双缩点 由图可知,左图中的缩法不符题意,而右图两个缩完后的点都满足题意 然后题中说必须要奇数个骑士参加会议,即找奇圈(有奇数个点的圈) 问题就转化成缩点后判断一个点…
题意 ​ 给定一张 \(n\) 个点 \(m\) 条边的无向图,\(q\) 次询问,每次询问两边之间的必经之点个数. 思路 ​ 求两点之间必经之边的个数用的是边双缩点,再求树上距离.而对比边双和点双之后,我们不难发现点和边之间的对应关系,边双分量和点双分量的性质很多都是对称的. 边双 点双 两点之间至少有两条不共边的路径 两边之间至少有两条不共点的路径 边双间由桥边连接 点双内没有割点 边双间由桥边连接 点双间由割点连接 ​ 另外,一个点双也是一个特殊的边双,就像一个点仙人掌是一个特殊的边仙人掌…
题意 ​ 给定一张 \(n\) 个点 \(m\) 条边的无向连通图,加入一条边,使得图中权值最小的桥权值最大,如果能使图中没有桥则输出 \(-1\). 思路 ​ 先对原图边双缩点,然后变成了一棵树.在树上加一条边等价于使一条路径上的边都不是桥,那么原题转化为在树上删一条路径,使得最小的边最大.固定一条最小的边之后模拟即可. 代码 #include<bits/stdc++.h> #define FOR(i, x, y) for(int i = (x), i##END = (y); i <=…