POJ - 2230 Watchcow(打印欧拉回路)

题意:一个无向图,要求找一条路径,走过每一条边恰好两次,且每次走的方向不同。很容易就能想到把这图转化为有向图求欧拉回路。题目保证一定能找到从1点出发回到1点的答案。

思路:首先把双向边的图建成两个单向边的图,题目给出时必定存在答案
首先思考一下:从一个欧拉回路中拖走一个小欧拉回路,结果也是一个欧拉回路
当一个点走完了,相当于一个欧拉回路已经被取出来了,可以直接输出这个点,同时,先没有出度的点,一定是先出发的点,所以,这点的顺序是要相反输出的!

//#include<bits/stdc++.h>
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<vector>
#define fi first
#define se second
#define FOR(a) for(int i=0;i<a;i++)
#define sc(a) scanf("%d",&a)
#define show(a) cout<<a<<endl;
#define show2(a,b) cout<<a<<" "<<b<<endl;
#define show3(a,b,c) cout<<a<<" "<<b<<" "<<c<<endl;
using namespace std;

typedef long long ll;
typedef pair<int, int> P;
typedef pair<P, int> LP;
const ll inf = 1e17 + 10;
const int N = 1e5+5;
const ll mod = 1000000007;
const int base = 131;


struct node
{
	int to,vis;
};


int n,m,k,ans,col[N],flag,de[N],f[N];
vector<node> v[N];

void dfs(int x)
{
	for(int i=0;i<v[x].size();i++)
	{
		if(!v[x][i].vis)
		{
			v[x][i].vis=1;
			dfs(v[x][i].to);
		}
	}
	cout<<x<<endl;
}

int main()
{
	ios::sync_with_stdio ( false );
	cin.tie ( 0 );

	cin>>n>>m;
	for(int i=1;i<=m;i++)
	{
		int x,y;
		cin>>x>>y;
		v[x].push_back(node{y,0});
		v[y].push_back(node{x,0});
	}
	dfs(1);




}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值