zoukankan      html  css  js  c++  java
  • POJ 2230 Watchcow 欧拉回路的DFS解法(模板题)

    Watchcow
    Time Limit: 3000MS Memory Limit: 65536K
    Total Submissions: 9974 Accepted: 4307 Special Judge
    Description

    Bessie’s been appointed the new watch-cow for the farm. Every night, it’s her job to walk across the farm and make sure that no evildoers are doing any evil. She begins at the barn, makes her patrol, and then returns to the barn when she’s done.

    If she were a more observant cow, she might be able to just walk each of M (1 <= M <= 50,000) bidirectional trails numbered 1…M between N (2 <= N <= 10,000) fields numbered 1…N on the farm once and be confident that she’s seen everything she needs to see. But since she isn’t, she wants to make sure she walks down each trail exactly twice. It’s also important that her two trips along each trail be in opposite directions, so that she doesn’t miss the same thing twice.

    A pair of fields might be connected by more than one trail. Find a path that Bessie can follow which will meet her requirements. Such a path is guaranteed to exist.
    Input

    • Line 1: Two integers, N and M.

    • Lines 2…M+1: Two integers denoting a pair of fields connected by a path.
      Output

    • Lines 1…2M+1: A list of fields she passes through, one per line, beginning and ending with the barn at field 1. If more than one solution is possible, output any solution.
      Sample Input

    4 5
    1 2
    1 4
    2 3
    2 4
    3 4
    Sample Output

    1
    2
    3
    4
    2
    1
    4
    3
    2
    4
    1
    Hint

    OUTPUT DETAILS:

    Bessie starts at 1 (barn), goes to 2, then 3, etc…
    Source

    USACO 2005 January Silver
    这道题当时做的时候,觉得好难啊,学长说这是欧拉回路,然后我一想没学,后来在课程总结中发现原来学了,自己没注意。对全图进行dfs,从规定起点开始,过程中记录经过了哪些边,以保证每条边只经过一次。当一个点的所有边都遍历完成后,把该点入栈。最后依次弹栈得到的就是欧拉路径。被入栈的点都是走投无路的点,如果存在欧拉路径,第一次出现 没有边一定是在走回到起点时,因为其他情况无论怎么走只可能略过一些边,而不可能走进死路,所以若存在欧拉回路,必定在最后一个点的最后一条边回到起始点。

    #include <iostream>
    #include <cstdlib>
    #include <cstring>
    #include <cstdio>
    using namespace std;
    const int  maxn 10005
    const int   maxm 100005
    struct Edge
    {
    int v, next;
    }edge[maxm];
    int n, m;
    int head[maxn];
    int ecount;
    bool vis[maxm];
    void addedge(int a, int b)  //接下一个边
    {
        edge[ecount].v = b;
        edge[ecount].next = head[a];
        head[a] = ecount++;
    }
    void dfs(int a)
    {
    	for (int i = head[a]; i != -1; i = edge[i].next)
        {
        	if (vis[i])
    		continue;
    		int v= edge[i].v;
            vis[i] = true;
            dfs(v); 
        }
        printf("%d
    ", a + 1); 从栈顶开始向下打印。
    }
    int main()
    {
        memset(head, -1, sizeof(head));
        memset(vis, 0, sizeof(vis));
        ecount = 0;
        scanf("%d %d", &n, &m);
    	for (int i = 0; i < m; i++)
    	 {
    			int a, b;
    	        scanf("%d %d", &a, &b);
    	        a--;
    	        b--;
    	        addedge(a, b);
    	        addedge(b, a);
    	    }
        dfs(0);
    	return 0;
    }
    
  • 相关阅读:
    Pandas使用详细教程(个人自我总结版)
    时间序列算法理论及python实现(2-python实现)
    时间序列算法理论及python实现(1-算法理论部分)
    卡方分布、卡方独立性检验和拟合性检验理论及其python实现
    配置环境变量时,cmd下运行java -version,报错:找不到或无法加载主类 -version
    Git 版本管理器学习笔记
    python、数据分析师、算法工程师的学习计划
    脏读、幻读、不可重复读、mvcc
    数据是如何存储在磁盘的
    Mysql之Buffer Pool详解与调优
  • 原文地址:https://www.cnblogs.com/lunatic-talent/p/12798864.html
Copyright © 2011-2022 走看看