dfs(找环)】的更多相关文章

「银联初赛第一场」自学图论的码队弟弟(dfs找环+巧解n个二元一次方程) 题链 题意:n条边n个节点的连通图,边权为两个节点的权值之和,没有「自环」或「重边」,给出的图中有且只有一个包括奇数个结点的环. 思路:n条边n个节点保证了是在一颗树的基础上加了一条边,有且只有一个奇数节点的环保证了,沿着一个节点走下去会碰到已经访问过的节点.对于方程的解,对1号节点赋予相对值0,遍历所有节点,使所有节点拥有一个相对于1号节点的相对值,具体分析见代码 #include <bits/stdc++.h> us…
题目链接:http://codeforces.com/problemset/problem/711/D D. Directed Roads time limit per test 2 seconds memory limit per test 256 megabytes input standard input output standard output ZS the Coder and Chris the Baboon has explored Udayland for quite some…
题意 https://vjudge.net/problem/CodeForces-103B 很久很久以前的一天,一位美男子来到海边,海上狂风大作.美男子希望在海中找到美人鱼 ,但是很不幸他只找到了章鱼怪. 然而,在世界的另一端,人们正在积极的收集怪物的行为信息,以便研制出强大的武器来对付章鱼怪. 于地震的多发,以及恶劣的天气,使得我们的卫星不能很好的定位怪物,从而不能很好的命中目标. 第一次射击的分析结果会反映在一张由n个点和m条边组成的无向图上.现在让我们来确定这张图 是不是可以被认为是章鱼怪…
<题目链接> 题目大意: 给定一个$n$条边,$n$个点的图,每个点只有一条出边(初始状态),现在能够任意对图上的边进行翻转,问你能够使得该有向图不出先环的方案数有多少种. 解题分析: 很明显本题需要对环的部分和链的部分分开进行讨论,对于环的部分,能够使得该环不为有向环的方案数有$2^k-2$种($k$为环上的点数,相当于减去环上所有边都是顺时针和逆时针情况),对于链的部分,方案数就是$2^k$($k$为链上的点数).因为初始状态每个点只有一条出边,所以即使存在环,也一定是简单环(即不存在环套…
当我在准备做基环树的题时,经常有了正解的思路确发现不会找环,,,,,,因为我实在太蒻了. 所以我准备梳理一下找环的方法: 有向图 先维护一个栈,把遍历到的节点一个个地入栈.当我们从一个节点x回溯时无非两种情况: 1.从x延伸出去的环已经被找完: 2.从x延伸出去的地方并没有环: 也就是说从x延伸出去的地方包括x都已经对我们现在毫无意义了.所以说,当一个点回溯时,把它出栈. 当下一步要到的点在栈中,那说明找到了环.此时把栈中的节点拎出来打上标记即可. #include<iostream> #in…
求确定身份的人的个数. 只能确定狼的身份,因为只能找到谁说了谎.但一个人是否是民,无法确定. 将人视作点,指认关系视作边,有狼边和民边两种边. 确定狼的方法只有两种: 1. 在一个仅由一条狼边组成的环中,狼边指向的那个点必定是狼. 2. 环外指认铁狼为民的也必定是狼. 所以用原图找环求情况1中的铁狼,反向建图找情况2中的狼. #include <bits/stdc++.h> using namespace std; typedef long long LL; ; const int INF =…
题意:有n个只包含两个字母的字符串, 要求构造一个m*m的字母矩阵, 使得矩阵的每行每列都不包含所给的字符串, m要尽量大, 如果大于20的话构造20*20的矩阵就行了. 析:开始吧,并没有读对题意,后来才看懂什么意思,然后主要思想就是如果有环,那么一定是可以构造成20*20的,只要环一直重复就好,如果没有环, 那么就要找最长的链,然后矩阵长宽就是 (max+1)/2,然后和上面一样构造就好. 代码如下: #pragma comment(linker, "/STACK:1024000000,10…
原题戳这里 思路 分三种情况讨论: 1.有环 那显然是对于环长取个\(gcd\) 2.有类环 也就是这种情况 1→2→3→4→5→6→7,1→8→9→7 假设第一条链的长度为\(l_1\),第二条为\(l_2\),那么\(l_1\)和\(l_2\)需要满足\(l_1\equiv l_2(mod\ k)\),也就是\(k|(l_1-l_2)\).如果我们建权值为\(-1\)的反向边的话,找出来的环就涵盖了这种情况,并且取\(gcd\)就能满足等式 3.有链 对答案无影响 最后还需要加一个特判,就是…
传送门 思路: 题意大意:n条有向边,找出最大环. 我们发现,如果一个小朋友没有被任何人崇拜,那么他一定不位于环中.为此我们可以设置一个indug数组预处理.如果2被崇拜了那么indug[2]就加加,那么后续我们只需要dfs不为0的小朋友即可. 优化 可是遍历小朋友的话会有大量重复.比如1->3->5->1,我们遍历了1,那么其实3和5是不需要去管的对吧.所以就有了代码. #include <bits/stdc++.h> using namespace std; int vi…
题目链接:http://codeforces.com/problemset/problem/659/E 给你n个点,m条双向边,然后让你把这些边变成有向边,使得最后的图中入度为0的点的个数最少,求最少的点的个数: 我们很容易的看出当一个点所在的图中存在环时,那么这里面的所有点都可以入度不为0,当不存在的时候最少有一个点的入度为0: dfs学的不好,所以没做出来: #include <iostream> #include <cstdio> #include <cstring&g…