1341:【例题】一笔画问题

很抱歉,因为最近在忙开学(本人小学六年级),我有一周没写了。在这里道个歉。我也哭笑不得~日更没了。

那么就来吧,我会尝试重启日更的~~。


1341:【例题】一笔画问题

时间限制: 1000 ms         内存限制: 65536 KB

提交数: 7686     通过数: 2638

【题目描述】

如果一个图存在一笔画,则一笔画的路径叫做欧拉路,如果最后又回到起点,那这个路径叫做欧拉回路。

根据一笔画的两个定理,如果寻找欧拉回路,对任意一个点执行深度优先遍历;找欧拉路,则对一个奇点执行dfs,时间复杂度为O(m+n),m为边数,n是点数。

【输入】

第一行n,m,有n个点,m条边,以下m行描述每条边连接的两点。

【输出】

欧拉路或欧拉回路,输出一条路径即可。

【输入样例】

5 5

1 2

2 3

3 4

4 5

5 1

【输出样例】

1 5 4 3 2 1

思路:统计各个点的总度数,各个算。起点的话,只有奇点是欧拉路,欧拉回路随便哪个点。


代码大放送:

#include <bits/stdc++.h>

using namespace std;

int n,m,go[2050],totn[1050],x,y,start=1,sum,tot;//如果是欧拉回路,是任意一点做起点

bool b[1005][1050];

void dfs(int k)

{

  for(int i=1; i<=n; i++)

  {

    if(b[i][k])

    {

      b[i][k]=false;

      b[k][i]=false;

      dfs(i);//尝试

    }

  }

  go[++tot]=k;//记录

}

int main()

{

  cin>>n>>m;

  for(int i=1; i<=m; i++)

  {

    cin>>x>>y;

    b[x][y]=b[y][x]=true;

    totn[x]++;

    totn[y]++;

  }//输入

  for(int i=1; i<=n; i++)

  {

    if(totn[i]%2)

    {

      sum++;

      if(sum==1) start=i;

    }//取起点

  }

  dfs(start);//dfs

  for(int i=1; i<=tot; i++) cout<<go[i]<<" "; //输出

  cout<<endl;

  return 0;

}


今天就到这吧,明天争取日更。加油!明天讲1374。

明天是周一(4.27),我得准备上课了。再见。

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 在C语言中,五种基本数据类型存储空间长度的排列顺序是: A)char B)char=int<=float C)ch...
    夏天再来阅读 4,167评论 0 2
  • sì 支zhī茶chá 对duì 酒jiǔ,赋fù 对duì 诗shī,燕yàn子zi 对duì 莺yīng 儿é...
    每个人的孟母堂阅读 1,527评论 0 6
  • 一年级语文上册生字表 生字表一(共400字) 啊(ā)爱(ài)安(ān)岸(àn)爸(bà)八(bā)巴(bā)...
    meychang阅读 3,268评论 0 6
  • "use strict";function _classCallCheck(e,t){if(!(e instanc...
    久些阅读 2,205评论 0 2
  • 何为人生超链接? 如果非要把人生做个比喻的话,过去人们可以把人生比喻成一本书,你持续往下翻书,它的结尾是确定的等着...
    盘耕阅读 4,845评论 0 1

友情链接更多精彩内容