牛客小白月赛17 E D F

F 题 方程不好直接解 二分求答案 (有单调性)
D 题 数据太少 而且是静态的 直接先暴力所有的 输入完一个一个对就好

E 题

链接:https://ac.nowcoder.com/acm/contest/1085/E
来源:牛客网

题目描述
小sun最近为了应付考试,正在复习图论,他现在学到了图的遍历,觉得太简单了,于是他想到了一个更加复杂的问题:

无向图有n个点,从点1开始遍历,但是规定:按照每次“走两步”的方式来遍历整个图。可以发现按照每次走两步的方法,不一定能够遍历整个图,所以现在小sun想问你,最少加几条边,可以完整的遍历整个图。

输入描述:
第一行两个整数n,m代表图的点数和边数。

接下来m行,每行两个整数u,v代表u,v有边相连(无向边)
输出描述:
输出一行,代表最少要添加的边数。
示例1

输入
5 4
1 2
2 3
3 4
4 5
输出
1
示例2

输入
5 5
1 2
2 3
3 4
4 5
1 5
输出
0
备注:
数据范围:

3≤n≤1e5, 2≤m≤1e5
1≤u,v≤n
图中点的编号从1到n。

走两步的意思:

比如现在有两条边:(1,2),(2,3),从1开始走,只能走到1或者3。

(1->2->3),(1->2->)

题解:
很容易发现,如果存在奇环,那么这个奇环所在的连通块所有的点都可以遍历到。

那么这个图如果存在奇数环,只需把这个奇数环所在连通块与其它连通块连接就可以了,答案是连通块个数-1.

如果不存在奇数环,那么可以将奇数个连通块连在一起构成一个奇数环,再与其它连通块连接,答案为连通块个数。

怎么求有多少个连通块,是否存在奇数环,可以用图染色的方法,如果存在奇数环,那么就存在相邻两个节点颜色一样,如果是偶数环,就不存在相邻两个节点颜色一样。

作者:sd197555
链接:https://ac.nowcoder.com/discuss/258571?type=101&order=time&pos=&page=1
来源:牛客网
考察这个遍历的性质,发现如果图存在奇环,那么跟当前奇环联通的所有点全部可以遍历到。
首先讨论图有多少个联通块,在这些联通块中,若存在一个包含奇环的联通块,那么将当前的联通块与所有的不包含奇环的联通块相连就行了,答案个数为不包含奇环的联通块个数。
若所有的联通块都不包含奇环,那么可以用若干条边在k个(k为奇数)联通块之间构造一条奇环,然后再把其他的联通块跟当前的奇环相连,答案为联通块的个数。

#include <bits/stdc++.h>
using namespace std;
const int maxn = 1e5 + 5;
typedef long long ll;
int n, m, k;
int cas;

int head[maxn], cnt;
int to[maxn << 1], nxt[maxn << 1];

void ade(int a, int b) {
	to[++ cnt] = b;
	nxt[cnt] = head[a], head[a] = cnt;
}

int dfn[maxn], ans = 0;
bool v[maxn];
void dfs(int u, int f, int yuan) {
	dfn[u] = f;
	for(int i = head[u]; i; i = nxt[i]) {
		if(!dfn[to[i]]) dfs(to[i], f <= 1 ? 2 : 1, yuan);
		else if(f == dfn[to[i]]) {
			if(v[yuan]) continue;
			else ans ++;
			v[yuan] = 1;	
		}
	}
}

signed main() {
	scanf("%d %d", &n, &m);
	for(int i = 1, a, b; i <= m; i ++) {
		scanf("%d %d", &a, &b);
		ade(a, b), ade(b, a);
	}
	int coun = 0;
	for(int i = 1; i <= n;  i++) {
		if(!dfn[i]) {
			dfs(i, 0, i);
			coun ++;
		}
	}
	if(ans) cout << coun - ans << endl;
	else cout << coun << endl;
	return 0;
}
全部评论

相关推荐

2025-12-25 10:16
已编辑
合肥工业大学 后端工程师
如题,在历经了长达多月的焦急等待,楼主也算是如愿以偿收到了梦中情司的意向了,秋招也终于是落下了帷幕,虽然手中的offer不够打牌,但已经满足了。华为时间线:9.3&nbsp;笔试环节,惊险通过10.15&nbsp;线下面试,前两轮技术面手撕都比较轻松,面试官态度也很好,最后一轮主管面,向主管表达了强烈的意愿,主管很和蔼,面试体验非常棒,1125定律后入池成功11.19&nbsp;收到接口人的保温电话12.9&nbsp;接到部门hr的保温电话,介绍了一下部门负责的工作12.23&nbsp;收到华为的意向书,成为华孝子一枚~期间收到了之前实习过的公司的offer,害怕华子泡不出来就先签三方了,这下不得不毁约了,在此向前司道个歉,也感谢前司对我的认可和托举,祝业务蒸蒸日上~感谢从今年三月开始找暑期实习以来,所有朋友和家人的鼓励,我们宿舍的就业氛围相当好,大家会分享各种有用的信息以及面试中遇到刁钻的面试题,在有人收到offer的时候我们都会发自内心的高兴和祝福,在我去线下面的时候也借我穿过西服.....能在大学四年分入这么好的宿舍拥有这么这么好的舍友除了幸运我找不出其他的形容词。还要感谢我的父母,在我每一次面试前都给予鼓励,也在失败的时候安慰我,他们的托底是我前进的基石,以后有工资了要给父母买很多东西最感谢的是我的女朋友,我们从大一相识,一直坚持到大四,她是一个非常优秀也异常坚定的女生,也正是因为她的实力出众早再年初就定好了要去上海的一家外企。我为了也去上海,从暑期实习开始投了不少上海的岗位但无一例外的都被拒之门外,但这期间她从来没有嫌弃过我,反而一直鼓励我相信我,如果说父母的托底是我前进的基石,那女朋友的鼓励和信任则是我前进的动力和方向。在如今这个充满戾气和对立的社会,能找到一个一心一意彼此喜欢的人实在是很难得,我深知这种珍贵所以更会加倍珍惜也感谢自己吧,在经历了无数个失眠的夜晚和面试失败的打击下,最终还是迎来了最好的结果,记得在华为线下面的前几周我几乎回到了高三时期的作息,那真是一段充实美好的时光,好在最后的结果也没有辜负这份努力也想跟所有的牛友说:不要因为一时的失败而自怨自艾,妄自菲薄,只要坚持下去,总会有柳暗花明又一村的惊喜在等待着你,机会总是垂青于有准备的人,要相信否极泰来,相信自己。朋友,坚定地相信未来吧,相信不屈不挠的努力,相信战胜死亡的年轻,相信未来、热爱生命。
小肥罗:有这样的女朋友真是幸福
秋招白月光
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务