CSU - 1356 Catch (判奇环)

题目传送门:CSU - 1356 Catch

题目大意:

存在一个n个点m条边的无向图,给定一个出发点,每个时间点能够走到相邻的下个点。能够走重复的边,

问是否存在某一个时间点,他可能停留再任意的n个点之间。

分析:

首先图是联通的,不连通则无法到达一部分点,可以发现如果该图是一条链的话,到达的点分两种情况

(奇数时间到达和偶数时间到达)因此无法满足条件。当图是一个偶数环时,同样无法满足要求,可以分析

只有存在奇数环的时候才能满足再某一时刻处于任何位置。所以题目即判断该图中是否存在奇数环即可

代码:

搜索过程中,给每个点一个val值,每次+1,当找到一条边上,两个val值相差+1为奇数则存在奇数环

#include<iostream>
#include<vector>
#include<cstring>
#include<cmath>
using namespace std;
const int MAX=100000+9;
int t,n,m,s,u,v;
int vis[MAX];
vector<int>G[MAX];
bool dfs(int u,int val)
{
    vis[u]=val;
    for(int i=0;i<G[u].size();i++){
        int v=G[u][i];
        if(!vis[v])dfs(v,val+1);
        else if(abs(vis[u]-vis[v])%2==0)return true;    //存在奇环
    }
    return false;
}
int main()
{
    int cas=1;
    scanf("%d",&t);
    while(t--)
    {
        memset(vis,0,sizeof(vis));
        for(int i=0;i<MAX;i++)
            G[i].clear();
        printf("Case %d: ",cas++);
        scanf("%d%d%d",&n,&m,&s);
        for(int i=0;i<m;i++){
            scanf("%d%d",&u,&v);
            G[u].push_back(v);
            G[v].push_back(u);
        }
        if(dfs(s,1))printf("YES\n");
        else printf("NO\n");
    }
    return 0;
} 

染色法:就是给每个点进行标号,初始值全为-1,标为0,1 如果存在一条边连接的两个点标号相同,

那么就是存在一个奇数环

#include<iostream>
#include<vector>
#include<cstring>
#include<cmath>
using namespace std;
const int MAX=100000+9;
int t,n,m,s,u,v;
int vis[MAX];
vector<int>G[MAX];
bool dfs(int u,int val)
{
    vis[u]=val;
    for(int i=0;i<G[u].size();i++){
        int v=G[u][i];
        if(vis[v]==-1)dfs(v,!val);            //标记为0 1
        else if(vis[v]==val)return true;    //该边两点标记相同,存在奇环
    }
    return false;
}
int main()
{
    int cas=1;
    scanf("%d",&t);
    while(t--)
    {
        memset(vis,-1,sizeof(vis));            //初始值全为-1
        for(int i=0;i<MAX;i++)
            G[i].clear();
        printf("Case %d: ",cas++);
        scanf("%d%d%d",&n,&m,&s);
        for(int i=0;i<m;i++){
            scanf("%d%d",&u,&v);
            G[u].push_back(v);
            G[v].push_back(u);
        }
        if(dfs(s,0))printf("YES\n");
        else printf("NO\n");
    }
    return 0;
} 

原文地址:https://www.cnblogs.com/LjwCarrot/p/10739683.html

时间: 2024-10-12 07:09:14

CSU - 1356 Catch (判奇环)的相关文章

【POJ 2942】Knights of the Round Table(双联通分量+染色判奇环)

[POJ 2942]Knights of the Round Table(双联通分量+染色判奇环) Time Limit: 7000MS   Memory Limit: 65536K Total Submissions: 11661   Accepted: 3824 Description Being a knight is a very attractive career: searching for the Holy Grail, saving damsels in distress, an

CSU - 1356 Catch(dfs染色两种写法,和hdu4751比较)

Description A thief is running away! We can consider the city where he locates as an undirected graph in which nodes stand for crosses and edges stand for streets. The crosses are labeled from 0 to N–1. The tricky thief starts his escaping from cross

Kattis - hoppers Hoppers(判奇环)

题目传送门:Kattis - hoppers  Hoppers 题目大意: 你是一个黑客,现在你发明了一种感染病毒,这种感染病毒能够感染到与该主机相隔一个点的主机. 存在一个无向图,每个点代表一台主机,每条无向边表示两台主机相连,现在你有个计划是通过感 染一个电脑让所有电脑感染,你可以为两条电脑之间加边,需要你求出最少加多少条边能够完成计划 分析: 我们能够发现奇数环中任何一个点被感染都能够使奇数环中所有的点感染.因此我们可以利用该性质. 为了满足条件(感染一个点使所有点被感染)存在几种情况:

(01 染色判奇环) hdu 3478

Catch Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 1296    Accepted Submission(s): 632 Problem Description A thief is running away!We can consider the city where he locates as an undirected g

HDU Catch (二分图判断奇环+并查集判断联通)

Problem Description A thief is running away!We can consider the city where he locates as an undirected graph in which nodes stand for crosses and edges stand for streets. The crosses are labeled from 0 to N–1. The tricky thief starts his escaping fro

[转载]HDU 3478 判断奇环

题意:给定n个点,m条边的无向图(没有重边和子环).从给定点出发,每个时间走到相邻的点,可以走重复的边,相邻时间不能停留在同一点,判断是否存在某个时间停留在任意的n个点. 分析: (1)首先,和出发点的位置没有关系.因为可以走重复的边,且时间没有限制大小. (2)图必须是联通的 (3) 1)图为:2-0-1-3 从0点出发(时间为0),一个时间后到达1或2(时间为1),再一个时间后到达0或3(时间为2)... 可以发现,点分为两类,奇数时间到达和偶数时间到达,答案为NO 2)图为:2-0-1-2

洛谷P3385 【模板】负环 DFS-SPFA 判负环 图论

洛谷P3385 [模板]负环 图论 今天get了 一个 DFS-SPFA 判负环的方法 一般的 BFS-SPFA 判负环 一般就是 不停地做,如果某点第 n+1次加入队列中,那么说明这个图存在负环然而我并不会证明,期望复杂度是 O(kM) k 大约是在 2 左右 但是其实对于一些极限数据,最坏可以把他卡到 O( NM) 额,这就直接炸飞了是不是,而且据说,一些数据比较强的题目,总会想到卡一卡SPFA的, 然后我们换一种思路 因为题目中一定存在一种 负环对吧,所以说假如你某段路径权值和为自然数的时

bzoj1690:[Usaco2007 Dec]奶牛的旅行(分数规划+spfa判负环)

前段时间准备省选没更,后段(?)时间省选考砸没心情更,最近终于开始恢复刷题了... 题目大意:有n个点m条有向边的图,边上有花费,点上有收益,点可以多次经过,但是收益不叠加,边也可以多次经过,但是费用叠加.求一个环使得收益和/花费和最大,输出这个比值. 显然这就是经典的分数规划题啊,就是最优比率环,那么就二分答案,将所有边(u,v)的边权改为[v的点权-(u,v)原边权*mid],这可以算是最优比率环的公式了吧,然后判一下是否有正环,有的话就说明答案可行.判正环有够别扭的,那就全部改成相反数然后

FZU2181+poj2942(点双连通+判奇圈)

分析:我们对于那些相互不憎恨的人连边,将每次参加会议的所有人(不一定是全部人,只需人数>=3且为奇数)看做一个点双联通分量,那么每个点都至少有两个点与他相邻.即需要保证双联通分量中存在奇圈.至于如何判奇圈,这里有一个性质:一个图是二分图当且仅当图中不存在奇圈.至于如何判断一个图是否是二分图,可以采用交替染色的方式判断. 传送门:FZU 2181 快来买肉松饼 #include<iostream> #include<cstdio> #include<cstring>