zoukankan      html  css  js  c++  java
  • 一笔画问题 题解

    1341:【例题】一笔画问题


    时间限制: 1000 ms         内存限制: 65536 KB
    提交数: 8409     通过数: 2915

    【题目描述】

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

    根据一笔画的两个定理,如果寻找欧拉回路,对任意一个点执行深度优先遍历;找欧拉路,则对一个奇点执行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

     今天为大家带来一道图论的题----------一笔画问题。读完题后便有一种思路:利用一个二维数组作为邻接矩阵来存储输入图边的信息,无边即为0,有边记为1,并用一维数组记录每个点的度,再利用另一个一维数组记录路径经过的点,以便最后输出。

    利用每个点的度判断出哪些点是奇点,深搜奇点,判断找出其邻接点,将邻接点记为已搜过,继续深搜邻接点的邻接点,直至循环结束,将其点i计入数组d保存此路径

    最后输出,即为正解

    讲了这么多,下面放出AC代码:

    #include<bits/stdc++.h>
    using namespace std;
    int mapn[1005][1005];//邻接矩阵
    int n,m;
    int s[105];
    int c=0;//控制路径记录数组的下标
    int d[2005];//记录路径
    void dfs(int i)
    {
    for(int j=1;j<=n;j++)
    {
    if(mapn[i][j]==1)
    {
    mapn[i][j]=0;
    mapn[j][i]=0;//将其标为已搜过
    dfs(j);//深搜下一个邻接点
    }
    }
    d[++c]=i;//记录路径经过的点
    }
    int main()
    {
    memset(mapn,0,sizeof(mapn));
    cin>>n>>m;
    int a,b;
    for(int i=1;i<=m;i++)
    {
    cin>>a>>b;
    mapn[a][b]=1;
    mapn[b][a]=1;
    s[a]++;
    s[b]++;//记录点的度为下面判断奇点做铺垫
    }
    int t=1;//定义t并给予初始值
    for(int i=1;i<=n;i++)
    {
    if(s[i]%2==1)
    {
    t=i;
    }//如果此点是奇点
    }
    dfs(t); //深搜奇点
    for(int i=1;i<=c;i++)
    {
    cout<<d[i]<<" ";
    }//输出记下的路径数组
    cout<<endl;
    return 0;
    }

  • 相关阅读:
    实现雨滴的效果
    rainyday.js
    XHTML1.0版本你知道么,跟html5版本有什么区别
    背景图合并用在什么地方最适合,有什么优点
    什么是css hack
    用一两句话说一下你对“盒模型”这个概念的理解,和它都涉及到哪些css属性
    块属性标签和行内属性标签及样式优先级
    【Loadrunner】Loadrunner 手动关联技术
    【黑盒测试】测试用例的常用方法
    【Linux】阿里云服务器部署--禅道
  • 原文地址:https://www.cnblogs.com/tcwbob/p/13442847.html
Copyright © 2011-2022 走看看