POJ 2230 Watchcow( 欧拉回路 )

来源:互联网 发布:linux proc 共享内存 编辑:程序博客网 时间:2024/06/02 23:20

题意:给定一张一定有解的图, 求每条边遍历不同方向两次再回到起点1,打印所经过的点。

解题思路:简单欧拉回路,因为已经确保是有解的, 所以不用判断连通性和是否为欧拉图,直接套模板就行了,每条边正反存两条就行了。

问题描述

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.

输入

* Line 1: Two integers, N and M. 

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

输出

* 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.

样例输入

4 51 21 42 32 43 4

样例输出

12342143241

提示

OUTPUT DETAILS: 

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



Memory: 5392 KB Time: 1610 MSLanguage: G++ Result: Accepted

#include<algorithm>#include<cstdio>#include<cstdlib>#include<cstring>#include<cmath>#include<cctype>#include<list>#include<iostream>#include<map>#include<queue>#include<set>#include<stack>#include<vector>using namespace std;#define FOR(i, s, t) for(int i = (s) ; i <= (t) ; ++i)#define REP(i, n) for(int i = 0 ; i < (n) ; ++i)int buf[10];inline long long read(){    long long x=0,f=1;    char ch=getchar();    while(ch<'0'||ch>'9')    {        if(ch=='-')f=-1;        ch=getchar();    }    while(ch>='0'&&ch<='9')    {        x=x*10+ch-'0';        ch=getchar();    }    return x*f;}inline void writenum(int i){    int p = 0;    if(i == 0) p++;    else while(i)        {            buf[p++] = i % 10;            i /= 10;        }    for(int j = p - 1 ; j >= 0 ; --j) putchar('0' + buf[j]);}/**************************************************************/#define MAX_N 10005#define MAX_M 50005const int INF = 0x3f3f3f3f;int head[MAX_N];int vis[MAX_M<<1];int ans[MAX_M<<1];int iq = 0;struct node{    int to, next;} edge[MAX_M << 1];int top = 0;inline void init(){    memset(head, -1, sizeof(head));    memset(vis, 0, sizeof(vis));    top = 0;    iq = 0;}void add_edge(int u, int v){    edge[top].to = v;    edge[top].next = head[u];    head[u] = top++;}void dfs(int now){    for(int k = head[now] ; k != -1 ; k = edge[k].next)    {        if(!vis[k])        {            vis[k] = 1;            dfs(edge[k].to);            ans[iq++] = edge[k].to;        }    }}int main(){    int n, m;    while(~scanf("%d%d", &n, &m))    {        init();        int u, v;        for(int i = 0 ; i < m ; i++)        {            u = read();            v = read();            add_edge(u, v);            add_edge(v, u);        }        dfs(1);//    cout<<1<<endl;        for(int i = 0 ; i < iq ; i++)        {            printf("%d\n", ans[i]);        }        printf("1\n");    }    return 0;}


0 0