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;
    }

  • 相关阅读:
    静态页面复习--网格嵌套练习
    静态页面复习--用semantic UI写苹果官网
    静态页面复习--用网格写一个landing page
    静态页面复习--用semantic UI画美国队长盾牌
    静态页面复习--semantic UI搭建简单博客页面
    SQL脚本--总耗CPU最多的前个SQL --平均耗CPU最多的前个SQL
    C#中基于GDI+(Graphics)图像处理系列
    MVC Action 返回类型
    Axure RP 7 8
    MVC object htmlAttributes,IDictionary<string, object> htmlAttributes 写法
  • 原文地址:https://www.cnblogs.com/tcwbob/p/13442847.html
Copyright © 2011-2022 走看看