Kattis - hoppers Hoppers(判奇环)

题目传送门:Kattis - hoppers  Hoppers

题目大意:

你是一个黑客,现在你发明了一种感染病毒,这种感染病毒能够感染到与该主机相隔一个点的主机。

存在一个无向图,每个点代表一台主机,每条无向边表示两台主机相连,现在你有个计划是通过感

染一个电脑让所有电脑感染,你可以为两条电脑之间加边,需要你求出最少加多少条边能够完成计划

分析:

我们能够发现奇数环中任何一个点被感染都能够使奇数环中所有的点感染。因此我们可以利用该性质。

为了满足条件(感染一个点使所有点被感染)存在几种情况:

1.如果存在不连通的一个奇数环和一个偶数环:需要加一条边,将奇数环和偶数环相连即可

2.如果存在两个不联通的奇数环:需要加一条边

3.如果存在两个不连通的偶数环:需要加两条边:一条边将两个偶数环联通,一条边加进任意一个偶数环中

构成一个奇数环。

因此我们可以得出这题的解法:通过dfs判断存在多少个联通块,如果存在n个联通块则需要n-1条边将所有联通

块连接。再每次进行dfs时判断,每个联通块中是否存在奇数环,如果存在奇数环则无需另外加一条边,否则加一条边

代码:

#include<iostream>
#include<cstdio>
#include<vector>
#include<cstring>
#include<cmath>
using namespace std;
const int MAX=500009;
int n,m,u,v;
vector<int>G[MAX];
int vis[MAX];
int odd=1;
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])+1)%2!=0)odd=0;        //存在奇数环
    }
}
int main()
{
    scanf("%d%d",&n,&m);
    for(int i=0;i<m;i++){
        scanf("%d%d",&u,&v);
        G[u].push_back(v);
        G[v].push_back(u);
    }
    int ans=0;
    for(int i=1;i<=n;i++){
        if(!vis[i]){
            dfs(i,1);
            ans++;        //记录存在多少个联通块
        }
    }
    printf("%d\n",ans-1+odd);
    return 0;
} 

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

时间: 2024-10-03 04:22:01

Kattis - hoppers Hoppers(判奇环)的相关文章

【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 (判奇环)

题目传送门:CSU - 1356 Catch 题目大意: 存在一个n个点m条边的无向图,给定一个出发点,每个时间点能够走到相邻的下个点.能够走重复的边, 问是否存在某一个时间点,他可能停留再任意的n个点之间. 分析: 首先图是联通的,不连通则无法到达一部分点,可以发现如果该图是一条链的话,到达的点分两种情况 (奇数时间到达和偶数时间到达)因此无法满足条件.当图是一个偶数环时,同样无法满足要求,可以分析 只有存在奇数环的时候才能满足再某一时刻处于任何位置.所以题目即判断该图中是否存在奇数环即可 代

(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 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>

Catch---hdu3478(染色法判断是否含有奇环)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3478 题意:有n个路口,m条街,一小偷某一时刻从路口 s 开始逃跑,下一时刻都跑沿着街跑到另一路口,问是否存在某一时刻出,小偷可能出现在任意路口: 如果小偷能走一个环,如果这个环是偶数个节点,那么某个节点只能在偶数时刻或者奇数时刻到达: 但是如果这个环是奇数个节点,他既可以在奇数时刻到达又可以在偶数时刻到达:所以这道题就是求是否存在一个奇环:如果存在输出YES,否则NO: 由于二分图中不能含有奇环,

Poj3259--Wormholes(Spfa 判负环)

Wormholes Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 36836   Accepted: 13495 Description While exploring his many farms, Farmer John has discovered a number of amazing wormholes. A wormhole is very peculiar because it is a one-way p