您的位置:首页 > 其它

UVA 10054项链(欧拉回路)

2013-08-23 18:36 387 查看
回路条件:

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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: