【Einstein学画画】

CSP马上到了,赶紧复习图论,顺便写下题解

题目要使画的次数最小,那么我们就可以知道最小的次数为1

于是这道题就是一笔画(欧拉路)板题,甚至还不需要求路径。

先来说一下什么是欧拉路吧:

七桥问题

欧拉说:是否可从某个地方出发,经过每座桥一次,回到原来出发的地方?

然后七桥问题就能转化成如下的一个无向图

顶点的度,就是指和该顶点相关联的边数。

出度:有向图中从某顶点出发的边数。

入度:有向图中在某顶点结束的边数。

欧拉回路:

若恰通过图中每条边一次回到起点,则称该回路为欧拉(Euler)回路。
具有欧拉回路的图称为欧拉图。
定理1:
一个无向图是欧拉图,当且仅当该图所有顶点度数都是偶数。
一个有向图是欧拉图,当且仅当该图所有顶点度数都是0(入度与出度之和)。
定理2:
存在欧拉回路的条件:图是连通的,且不存在奇点(顶点度数为奇数)

欧拉路(此题解法 !)

若从起点到终点的路径恰通过图中每条边一次(起点与终点是不同的点),
则该路径称为欧拉路。
定理1:
存在欧拉路的条件:图是连通的,且存在2个奇点。
如果存在2个奇点,则欧拉路一定是从一个奇点出发,以另一个奇点结束。

注意:一个连通图只可能有偶数个奇点

那么我们可以从欧拉路的介绍,发现只有2个奇点才能1笔画完。

#include<bits/stdc++.h>
using namespace std;
int n,m,cnt[1005],ans;
cnt[x]:x的度数
int main(){
    scanf("%d %d",&n,&m);
    for(int i=1;i<=m;i++){
        int x,y;
        scanf("%d %d",&x,&y);
        cnt[x]++;x点度数+1
        cnt[y]++;y点度数+1
    }
    for(int i=1;i<=n;i++)
        if(cnt[i]%2)判断是否为奇点
            ans++;奇点个数+1
    if(ans==2)若只有2个奇点
        puts("1");则可以一笔画完
    return 0;
}

现在我们已经知道如何判断欧拉路了

然后我们可以发现若每多出两个奇点,那么画的次数就会+1

又因为连通图只可能有偶数个奇点

所以,答案为

#include<bits/stdc++.h>
using namespace std;
int n,m,cnt[1005],ans;
cnt[x]:x的度数
int main(){
    scanf("%d %d",&n,&m);
    for(int i=1;i<=m;i++){
        int x,y;
        scanf("%d %d",&x,&y);
        cnt[x]++;x点度数+1
        cnt[y]++;y点度数+1
    }
    for(int i=1;i<=n;i++)
        if(cnt[i]%2)判断是否为奇点
            ans++;奇点个数+1
    printf("%d\n",ans/2);
    return 0;
}

于是我们愉快的交了上去,WA90。。。。。

这是为什么呢??

根据我们上面的做法,发现下列手购数据过不了:

3 3
1 2
2 3
3 1

利用构图我们可以得到这幅图:

咦,发现这3个点都不是奇数点,但也可以一笔画完,所以我们只需要特判一下即可AC

#include<bits/stdc++.h>上面代码已经有注释了,就不打了qwq
using namespace std;
int n,m,cnt[1005],ans;
int main(){
    scanf("%d %d",&n,&m);
    for(int i=1;i<=m;i++){
        int x,y;
        scanf("%d %d",&x,&y);
        cnt[x]++;
        cnt[y]++;
    }
    for(int i=1;i<=n;i++){
        if(cnt[i]&1==1)
            ans++;
    }
    if(ans==0)
        puts("1");
    else
        printf("%d\n",ans/2);
    return 0;
}
全部评论

相关推荐

面试官全程关摄像头1.自我介绍一下2.React和Vue哪个更熟悉一点3.你在之前那段实习经历中有没有什么技术性的突破(我只是实习了44天工作28天,我把我能说的都说了)4.你封装的哪个表单组件支不支持动态传值5.自己在实习阶段Vue3项目封装过hook吗6.hook有什么作用7.Vue2和Vue3的响应式区别(我说一个是proxy是拦截所有的底层操作,Object.defineProperty本身就是一个底层操作,有些东西拦截不了,比如数组的一些操作还有等等,面试官就说实在要拦截能不能拦截????我心想肯定不行呀,他的底层机制就不允许吧)8.pinia和vuex的区别(这个回答不出来是我太久没用了)9.pinia和zustand的区别,怎么选(直接给我干懵了)(我说react能用pinia吗&nbsp;&nbsp;他说要用的话也可以)10.渲染一万条数据,怎么解决页面卡顿问题(我说分页、监听滚轮动态加载,纯数据展示好像还可以用canvas画)(估计是没说虚拟表单,感觉不满意)11.type和interface的区别12.ts的泛型有哪些作用(我就说了一个结构相同但是类型不同的时候可以用,比如请求响应的接口,每次的data不同,这里能用一个泛型,他问我还有什么)13.你项目用的是React,如果让你再写一遍你会选择什么14.pnpm、npm、yarn的区别15.dependencies和devdependencies的区别总而言之太久没面试了,上一段实习的面试js问了很多。结果这次js一点没问,网络方面也没考,表现得很一般,但是知道自己的问题了&nbsp;&nbsp;好好准备,等待明天的影石360和周四的腾讯了&nbsp;&nbsp;加油!!!
解zj:大三的第一段面试居然是这样的结局
查看15道真题和解析
点赞 评论 收藏
分享
评论
1
收藏
分享

创作者周榜

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