CSU 1660 K-Cycle(dfs判断无向图中是否存在长度为K的环)

题意:给你一个无向图,判断是否存在长度为K的环。

思路:dfs遍历以每一个点为起点是否存在长度为k的环。dfs(now,last,step)中的now表示当前点,last表示上一个访问的 点,step一个记录路径长度的计数器,s【i】记录从起点到i点的路径长度。如果某点被访问第二次,则说明出现环,判断当前路径长度和它第一次出现是的 长度差是否等于K即可。

#include<cstdio>
#include<cstring>
using namespace std;
const int maxn=51;
bool e[maxn][maxn],flag;
int s[maxn];
int n,m,k,a,b,t;
bool dfs(int now,int last,int step)
{
    if(s[now]) return step-s[now]==k;
    s[now]=step;
    for(int i=0;i<n;i++)
    {
        if(i!=last&&e[now][i]&&dfs(i,now,step+1))       return true;
    }
    return false;
}

int main()
{
    scanf("%d",&t);
    while(t--)
    {
        for(int i=0;i<maxn;i++)
        {
            for(int j=0;j<maxn;j++)
            {
                e[i][j]=false;
            }
        }
        scanf("%d%d%d",&n,&m,&k);
        while(m--)
        {
            scanf("%d%d",&a,&b);
            e[a][b]=e[b][a]=true;
        }
        flag=false;
        for(int i=0;i<n;i++)
        {
            memset(s,0,sizeof(s));
            if(dfs(i,0,1))
                flag=true;
        }
        if(flag) printf("YES\n");
        else printf("NO\n");
    }
    return 0;
}
时间: 2024-11-06 23:19:41

CSU 1660 K-Cycle(dfs判断无向图中是否存在长度为K的环)的相关文章

cf290-2015-2-3总结与反思(dfs判断无向图是否有环)

bool dfs(int i,int pre) { visit[i]=true; for(int j=1;j<=v;j++) if(g[i][j]) { if(!visit[j]) return dfs(j,i); else if(j!=pre) //如果访问过,且不是其父节点,那么就构成环 return false; } } 方法:从一个顶点出发深度优先遍历可遍历所有结点,并且没有环或只有n-1条边. 若判断有环:可以在遍历时记住父结点,v的子结点w已被访问,且不是结点v的父结点,则存在环.

判断无向图/有向图中是否存在环

本文主要针对如何判断有向图/无向图中是否存在环的问题进行简单的论述. 一 无向图 1.利用DFS进行判断 利用DFS判断有向图是否存在环,是最为常用的一种方法,虽然这种方法很常用,但可参考的代码的实现比较少,下面对这种方法及其实现进行详细的阐述. 首先,利用DFS判断无向图中是否换的原理是:若在深度优先搜索的过程中遇到回边(即指向已经访问过的顶点的边),则必定存在环. 所以说,是否存在环的关键在于是否存在满足条件的"回边",那么如何判断回边呢? (1)首先,对图中的所有顶点定义三种状态

哈希(6) - 判断数组中是否存在重复元素且距离在K之内

给定一个包含多个重复元素的未排序的数组.另外给定一个数字k,且k小于数组大小.判断数组中是否包含重复元素,且它们相隔的距离处于范围k之内. 例如: Input: k = 3, arr[] = {1, 2, 3, 4, 1, 2, 3, 4} Output: false 所有重复元素的距离>k. Input: k = 3, arr[] = {1, 2, 3, 1, 4, 5} Output: true 存在重复元素1,且距离为3(==k). Input: k = 3, arr[] = {1, 2,

并查集(1)-判断无向图是否存在环

并查集是一种树型的数据结构,用于处理一些不相交集合(Disjoint Sets)的合并及查询问题.常常在使用中以森林来表示.集就是让每个元素构成一个单元素的集合,也就是按一定顺序将属于同一组的元素所在的集合合并. Find:确定元素属于哪一个子集.它可以被用来确定两个元素是否属于同一子集合. Union:将两个子集合并成同一个集合. 其实判断一个图是否存在环已经有相应的算法,此文用并查集来判断一个图是否有环. 我们可以用一个一维数组parent[] 来记录子集合. 看下面这个图: 0 | | 1

判断图中是否有环的方法

一.无向图 方法一:n算法: 原理是: 如果存在回路,则必存在一个子图,是一个环路.环路中所有顶点的度>=2. 第一步:删除所有度<=1的顶点及相关的边,并将另外与这些边相关的其它顶点的度减一. 第二步:将度数变为1的顶点排入队列,并从该队列中取出一个顶点重复步骤一. 如果最后还有未删除顶点,则存在环,否则没有环. 方法2: DFS搜索图,图中的边只可能是树边或反向边,一旦发现反向边,则表明存在环.该算法的复杂度为O(V). 二.有向图 主要有深度优先和拓扑排序两种方法 判断图中是否有环的方法

有向/无向图中搜环

经常遇到一类问题,提供一个图,判断其中是否含环.所谓的环是一条起点与终点相同的路径(至少含有一条边,两个结点).由于不带环的连通图和带环的连通图有着本质的区别,不带环的连通图是树,而树相较于一般的图可以支持更多更高效的算法,比如log2(n)时间复杂度内找任意两点的路径信息,在树上进行树形DP等等. 图按照边是否有向可以分为有向图和无向图.在两类图中找环的时间复杂度均为O(n),而判断是否含环的时间复杂度也是O(n),因此只陈述找环的方法. 无向图找环 无向图找环,因为无向图中没有明确的根,我们

给定数组A,大小为n,现给定数X,判断A中是否存在两数之和等于X

题目:给定数组A,大小为n,现给定数X,判断A中是否存在两数之和等于X 思路一: 1,先采用归并排序对这个数组排序, 2,然后寻找相邻<k,i>的两数之和sum,找到恰好sum>x的位置,如果sum=x则返回true, 3,找到位置后,保持i不变,从k处向前遍历,直到找到A[k]+A[i]等于x,并返回TRUE,如果找不到,则返回false. 论证步骤3:当前找到的位置恰好A[k]+A[i]>x,且前一位置的sum<x: 所以A[i]前面的数(不包括A[i])无论取哪两个数都

hdu4612 无向图中任意添加一条边后使桥的数量最少 / 无向图缩点+求树的直径

题意如上,含有重边(重边的话,俩个点就可以构成了边双连通). 先缩点成树,在求数的直径,最远的连起来,剩下边(桥)的自然最少.这里学习了树的直径求法:第一次选任意起点U,进行bfs,到达最远的一个点v(level最深)该点必然是树的直径的一个端点,,再从该点出发,bfs,到最深的一点,该点深度就是直径.(证明:先假设u,是直径上一点,S,T是直径的端点,设v!=t,则有(V,U)+(U,S)>(T,U)+(U,S),矛盾,故t=v:若u不是直径上一点,设u到直径上的一点为x,同理易证. 最后 缩

shell中条件判断if中的-z到-d的意思

shell中条件判断if中的-z到-d的意思 [ -a FILE ] 如果 FILE 存在则为真. [ -b FILE ] 如果 FILE 存在且是一个块特殊文件则为真. [ -c FILE ] 如果 FILE 存在且是一个字特殊文件则为真. [ -d FILE ] 如果 FILE 存在且是一个目录则为真. [ -e FILE ] 如果 FILE 存在则为真. [ -f FILE ] 如果 FILE 存在且是一个普通文件则为真. [ -g FILE ] 如果 FILE 存在且已经设置了SGID则