ACM入门之欧拉序列

Posted 辉小歌

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ACM入门之欧拉序列相关的知识,希望对你有一定的参考价值。

ACM入门之【dfs序列】

欧拉序列概念: 对一棵树进行 DFS,无论是第一次访问还是回溯,每次到达一个结点时都将编号记录下来,可以得到一个长度为
2𝑛 − 1的序列,这个序列被称作这棵树的欧拉序列。

例子:

模板:

int len=0,ans[100005];
void dfs(int u)

	mp[u]=1;
	ans[++len]=u; 
	for(int i=h[u];i!=-1;i=ne[i])
	
		int j=e[i];
		if(mp[j]) continue;
		dfs(j);
		ans[++len]=u;
	
	return;

例题:

题目说明了我们一共可以经过 至少2n个点 大于2n-1 故一定可以。求欧拉序列即可。

#include<bits/stdc++.h>
using namespace std;
const int N=1e5*5+10;
int n,m,k;
int h[N],e[N],ne[N],idx,len,ans[N];
vector<int>ve;
stack<int>st;
map<int,int>mp;
void add(int a,int b)

	e[idx]=b,ne[idx]=h[a],h[a]=idx++;

void dfs(int u)

	mp[u]=1;
	ans[++len]=u; 
	for(int i=h[u];i!=-1;i=ne[i])
	
		int j=e[i];
		if(mp[j]) continue;
		dfs(j);
		ans[++len]=u;
	
	return;

int main(void)

	memset(h,-1,sizeof h);
	cin>>n>>m>>k;
	while(m--)
	
		int a,b; cin>>a>>b;
		add(a,b),add(b,a);
	
	dfs(1);
	puts("YES");
	int w=ceil(2.0*n/k);
	queue<int>q;
	for(int i=1;i<=len;i++) q.push(ans[i]);
	for(int i=1;i<=k&&q.size();i++)
	
		int temp=min(w,(int)q.size());
		cout<<temp;
		for(int j=1;j<=temp;j++) 
		
			cout<<" "<<q.front();
			q.pop();
		
		cout<<endl;
	
	return 0;

以上是关于ACM入门之欧拉序列的主要内容,如果未能解决你的问题,请参考以下文章

ACM入门之欧拉图

ACM入门之dfs序列

ACM/ICPC 之 欧拉回路两道(POJ1300-POJ1386)

欧拉回路

ACM入门之搜索

树的经典问题和方法