图论之各种找环

给我们一个有向图,找出长度为3的环,如果有的话,输出环上的三个点,如果没有,输出-1

因为只有三个点,所以可以暴力, 枚举两条边,判断第三条是不是存在即可。  fa -> u, u -> i,    判断g[i][fa]==1?

 1 #include <iostream>
 2 #include <stdio.h>
 3 #include <string.h>
 4 #include <string.h>
 5 #include <math.h>
 6 #include <vector>
 7 #include <string>
 8 #include <vector>
 9 #include <set>
10 #include <map>
11 #include <queue>
12 #include <stack>
13 #include <algorithm>
14 #include <functional>
15 using namespace std;
16
17 const int N = 5000 + 10;
18 char g[N][N];
19 bool vis[N];
20 int n;
21 int a,b,c;
22 void dfs(int u, int fa)
23 {
24     vis[u] = true;
25     for(int i=1; i<=n&&(!a||!b||!c);++i)
26     {
27         if(g[u][i]==0) continue;
28         if(fa!=-1 && g[i][fa]==1)
29         {
30             a = fa;
31             b = u;
32             c = i;
33         }
34         if(!vis[i])
35             dfs(i,u);
36     }
37 }
38 int main()
39 {
40
41     while(scanf("%d",&n)!=EOF)
42     {
43         for(int i=1;i<=n;++i)
44         {
45             scanf("%s",g[i]+1);
46             for(int j=1;j<=n;++j)
47                 g[i][j] -= ‘0‘;
48
49         }
50         memset(vis,0,sizeof(vis));
51         a = b = c = 0;
52         for(int i=1;i<=n;++i)
53             if(!vis[i])
54                 dfs(i,-1);
55         if(!a)
56             printf("%d\n",-1);
57         else
58             printf("%d %d %d\n",a,b,c);
59
60     }
61     return 0;
62 }
时间: 2024-10-11 04:06:46

图论之各种找环的相关文章

杭电1272 并查集找环+判断连通

杭电1272 并查集找环+判断连通 E - E Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Submit Status Practice HDU 1272 Description 上次Gardon的迷宫城堡小希玩了很久(见Problem B),现在她也想设计一个迷宫让Gardon来走.但是她设计迷宫的思路不一样,首先她认为所有的通道都应该是双向连通的,就是说如果有一个通道连通了房间A和B

zstu.4191: 无向图找环(dfs树 + 邻接表)

4191: 无向图找环 Time Limit: 5 Sec  Memory Limit: 128 MB Submit: 117  Solved: 34 Description 给你一副无向图,每条边有边权,保证图联通,现在让你判断这个图是否有异或值大于零的环存在. Input 多组测试数据,每组先输入两个数n m,表示图的点跟边的数量. 然后是m行,每行三个数a b c.代表一条边的起点,终点,边权. 1 <= n<= 100000, 1 <= m <= 200000. 1 <

九章算法面试题28 链表找环

九章算法官网-原文网址 http://www.jiuzhang.com/problem/28/ 题目 初阶:给一个单链表,判断这个单链表是否存在环,如1->2->3->4->2是一个存在环的链表.要求使用O(1)的额外空间. 进阶:求出环的入口.同样要求O(1)的额外空间. 解答 初阶:用两根指针,从链表头出发,一根慢指针每次走一步,另外一根快指针每次走两步.直到他们相遇(有环)或者快指针走到NULL(无环). 进阶:相遇之后,将一根指针挪到链表头,两根指针每次都移动一步,直到再次

【CodeForces】915 D. Almost Acyclic Graph 拓扑排序找环

[题目]D. Almost Acyclic Graph [题意]给定n个点的有向图(无重边),问能否删除一条边使得全图无环.n<=500,m<=10^5. [算法]拓扑排序 [题解]找到一个简单环,则欲删除的边一定经过该环.尝试环上的每一条边(至多n条边)后再次拓扑排序判断全图是否有环. 拓扑排序后定位到简单环:剩余图是环+环内DAG,DFS过程中将走入死路的点标-1,访问过标1,找到访问过的点就是简单环.换起始点直到找到环为止. 复杂度O(nm). #include<cstdio>

HDU - 6370 Werewolf 2018 Multi-University Training Contest 6 (DFS找环)

求确定身份的人的个数. 只能确定狼的身份,因为只能找到谁说了谎.但一个人是否是民,无法确定. 将人视作点,指认关系视作边,有狼边和民边两种边. 确定狼的方法只有两种: 1. 在一个仅由一条狼边组成的环中,狼边指向的那个点必定是狼. 2. 环外指认铁狼为民的也必定是狼. 所以用原图找环求情况1中的铁狼,反向建图找情况2中的狼. #include <bits/stdc++.h> using namespace std; typedef long long LL; const int maxn =1

【链表】怎么判断链表有环,怎么找环节点

思路(证明有环): 定义快慢指针fast和slow,fast每次前进两步,slow每次前进一步: 当fast和slow在到达链尾之前相遇的话,就证明有环(类似于在操场上跑步跑的慢的被快的套圈但总会遇到): 思路(找环结点): fast和slow相遇之后,fast不动,slow回到最初的起点,然后一步一步的等在再次相遇,这时候相遇地点就是环结点 证明如下,是个数学问题... 设一环的距离是R,k代表环数 slow走过的距离:AB+BC fast走过的距离:AB+BC+k*R 因为slow每次一步,

图论 公约数 找环和链 BZOJ [NOI2008 假面舞会]

BZOJ 1064: [Noi2008]假面舞会 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 1655  Solved: 798[Submit][Status][Discuss] Description 一年一度的假面舞会又开始了,栋栋也兴致勃勃的参加了今年的舞会.今年的面具都是主办方特别定制的.每个参加舞会的人都可以在入场时选择一 个自己喜欢的面具.每个面具都有一个编号,主办方会把此编号告诉拿该面具的人.为了使舞会更有神秘感,主办方把面具分为

《编程之美》3.6判断链表是否相交之扩展:链表找环方法证明

先看看原题:<编程之美>3.6编程判断两个链表是否相交,原题假设两个链表不带环. 为了防止剧透使得没看过原题目的读者丧失思考的乐趣,我把最好的解法隐藏起来.由于这个问题本身的解答并不是本文的重点,扩展问题也采用这种形式呈现. 注:位于(*)符号之间的文字出自于:http://blog.csdn.net/v_july_v/article/details/6447013,作者v_JULY_v. 用指针p1.p2分别指向两个链表头,不断后移:最后到达各自表尾时,若p1==p2,那么两个链表必相交 用

HDU5957 Query on a graph(拓扑找环,BFS序,线段树更新,分类讨论)

传送门:http://acm.hdu.edu.cn/showproblem.php?pid=5957 题意:D(u,v)是节点u和节点v之间的距离,S(u,v)是一系列满足D(u,x)<=k的点的集合,操作1:将S(u,k)内节点权值增加或者减小,操作2:查询S(u,k)内节点的权值和 题解:因为题目说了查询和更新的距离小于等于k,k最大为2,所以很显然要分情况讨论k为0.1.2的情况 因为是多次更新,我们显然是需要用线段树来维护节点权值的 运用线段树和bfs序的知识我们知道 对一个棵树求BFS