一些题外话+算法基础课判断二分图()

171 阅读6分钟

一些题外话

今天已经正月初十了,偶然问了好朋友一句,县中(高中母校)什么时候开学啊(我在外地),好朋友说正月初八就开了啊,不知怎么,听到这句话,再想想自己疯玩的这么多天,仔细对比想想,竟然多了一分伤感和无奈,我们当时高三的时候什么时候开的学啊,我也不记得了,两句简短的对话后,我沉默了,两年前的我们可能也是初八开学的,甚至更早,当时冒着严寒,我们早早的来到学习,坐在教室,早读,一周一次英语考试,一次数学考试,一次物理小测,一次化学小测,一篇语文作文,铺天盖地的六门学科的试卷和辅导书在其他人还沉浸在过年的喜悦中时,沉重的向我们压来,日复一日得重复着前一天所做的事情,早读,四节课,和lxl,nh,zxm吃饭(大部分是和lxl),每天为数不多“放松”的时间就是和他们在吃饭时畅聊,吹牛(哈哈哈),甚至是和nh讨论数学,以及能在某个角落静静的观察她(我当时属于比较怂的),中午午休睡不着(神经衰弱),只能闭目养神或者看书写题,体育活动课大课间我不参加和他们在教室写写作业聊聊天(当时还因为我个人的问题,跟其中之一的后桌把关系弄得很僵,后半学期一句话都没说过),为数不多的体育课还是在教室度过的,然后晚上吃饭继续聊天,如果运气好,可以继续看她,然后晚自习,要么做题,要么考试,要么老师讲试卷,然后我有可能试卷找不到,只能拿一张以前的试卷装样子,然后挨批,然后放学有时候和lxl一起骑车回家,有时候爸妈一起来接我,有时候爸爸给我打个的,说句实话,那个时候的我真的不快乐,天天做着80%我不喜欢的事情,我不擅长的学科以及我不喜欢的事情,甚至还要挨批,当时身体也不好,有些很难受的事情,我跟很多很多人都说过,我的高中生活特别的痛苦,难过,然后说这些话的真正原因是什么呢,想必大家也都知道,就是高考的失利,这些痛苦我都能忍受(谁不是呢只要高考能考的好),因为高二没能参加全国高中数学联赛以及学初考试没能进入强化班,我高中的三个梦想已经破灭了两个了,最后的高考我真的不希望再失利了,但是,由于我的心态不行,基础知识不扎实,身体不好,运气不好(肯定的)等多方面原因,最后一个梦想也未能如愿,最后我也没有勇气复读,然后只能去了现在这所双非大学...... 几乎是一瞬间,我脑海中浮现出来这些画面,最终这么多情感只汇成了我的一句话“当时也是为了高考考个好成绩才那么早去学校学习的啊”,我知道,说这个是徒劳的,无益的,甚至是一种懦夫的表现吧,总是想着过去,然而这一切的一切确实是我难以忘怀的啊,,当时基本能去211,可以冲刺985的成绩结果比一本线高了一点进了一所双非,当时数学如日中天的我高考数学来了个彻彻底底的滑铁卢,当时高二连续四次月考全班第一,其中一次全校第一的我都没被通知高联,就直接失去了机会,这一切的一切真的是让我心痛,让我特别特别的难过,让我流下了眼泪,从高考之后,我的梦里经常出现这些事情:我和nh被数学老师骂因为数学没考好,老师是这样说的:要是xx这个错误你们再犯,你们高考数学也考不好,当上我们还嬉皮笑脸的(跟老师关系很好,经常找他唠嗑)。梦醒之后,潸然泪下,我没有高考了啊,我高考考完了啊,我在龙山校区的床上啊,我现在不在三茅的家里了啊。还做过一个梦:梦见我和nh分别在CMO和NOI中都取得了金牌,最后我们都考上了TP(哈哈,当然是做梦了),梦醒之后我一阵苦笑,事实是我高联都没能参加,nh第一年NOIP差一名省一,第二年CSP炸裂,省队梦也随之烟消云散,他最后去了南邮,我去了石家庄,至今我都记得我在梦里强烈的确认自己不是在做梦,我真的拿了CMO金(想疯了都)。

再想想大学生活,开始还算过的比较好吧,积极向上,为了弥补高中的遗憾,竭尽全力提升自己,后来自从放弃了数学开始学算法竞赛,我就对课内的东西比较疏忽,以至于这学期期末的惨烈,现在就只有一条路,把算法竞赛学到底,不要让算法竞赛成为第二个数学竞赛!(结尾意想不到的突兀,我不会告诉你是因为我敲不到字了)。

题目

如果看到这里的读者,真是谢谢您啦,看了我那么多废话。不emo啦,进入正题:

2023-01-30 (6).png

输入样例:

4 4
1 3
1 4
2 3
2 4

输出样例:

Yes

首先我们要明白一点,二分图有一个充要条件(这里就不证明了,比较显然): 就是:二分图内不能存在奇数环,因此我们可以用二染色的方式来判断,就是说我们先对一个点进行染色,如果说最后得出结论这个点与应该被染成的颜色冲突,那么久不是二分图,用的性质见上一题(匈牙利算法详细解释了)。

代码

#include <iostream>
#include <cstring>
using namespace std;
const int N=200010;//记号要开二倍,无向图md
int e[N],idx,ne[N],h[N],m,n,colour[N];、、colour数组是有两个值1 2 用来记录点染的颜色
inline void add(int a,int b){
    e[idx]=b,ne[idx]=h[a],h[a]=idx++;
}
bool dfs(int u,int c){//判断u被染成c是否成立
    colour[u]=c;
    for(int i=h[u];~i;i=ne[i]){
        int j=e[i];
        if(!colour[j]){
            if(!dfs(j,3-c)) return false;//如果不成立,肯定不是二分图
        }
        else if(colour[j]==c) return false;//如果颜色冲突也不是二分图
    }
    return true;//否则就是确定这个点没问题
}
int main(){
    cin>>n>>m;
    memset(h,-1,sizeof h);
    while(m--){
        int a,b;
        scanf("%d%d",&a,&b);
        add(a,b),add(b,a);
    }
     bool flag=true;
    for(int i=1;i<=n;i++){
        if(!colour[i]){//如果这个点没被染色
            if(!dfs(i,1)){//如果i寄了直接输出不是二分图
                flag=false;
                break;
            }
        }
    }
    if(!flag) puts("No");
    else puts("Yes");
    return 0;
}