UVA 10054项链(欧拉回路)

回路条件:

1.所有点的度数必须为偶数。

2.图必须连通。

3.图必须首尾相接。

思路:先统计度数,度数全为偶数,则找任意一点一路搜下去,并将搜到的边保存,

   如果最后保存的边不足n条,说明图不连通,如果是n条,判读是第一条和最后一条是否相接。

 

#include <iostream>

#include <cstring>

#include <vector>

using namespace std;

struct edge

{

	int x,y;

};

int a[55][55],du[55];

vector<edge> my;

void jie(int u) //一路接下去,如果可以组成回路,肯定可以接出一条路径 

{	edge t;

	for(int v=1;v<=50;v++)

	if(a[u][v])

	{

		a[u][v]--; a[v][u]--;

		t.x=u; t.y=v;

		my.push_back(t);

		jie(v);

	}

}

int main(int argc, char *argv[])

{

	int t,i,j,n,k=1,u,v;

	cin>>t;

	while(t--)

	{

		cin>>n;

		memset(a,0,sizeof(a));

		memset(du,0,sizeof(du));

		for(i=1;i<=n;i++)

		{

			cin>>u>>v;

			a[u][v]++; a[v][u]++;

			du[u]++; du[v]++; //统计度数 

		}

		int flag=1;

		for(i=1;i<=50;i++)

		    {if(du[i]%2) flag=0; break;}//存在奇度数,肯定不能组成回路 

		if(flag)

		{

			my.clear();

			jie(u);

			if(my.size()!=n||my[0].x!=my[n-1].y) flag=0; //图是否连通,并且首位相接 

		}

		if(k!=1) cout<<endl;

		cout<<"Case #"<<k<<endl; k++; 

		if(!flag) cout<<"some beads may be lost"<<endl;

		else 

		{

			for(i=0;i<my.size();i++)

			cout<<my[i].x<<" "<<my[i].y<<endl;

		}

	}

	return 0;

}


 

 

你可能感兴趣的:(uva)