题目地址:点击打开链接
并查集,欧拉回路,欧拉回路打印
#include <iostream>
#include <vector>
#include <utility>
#include <cstring>
using namespace std;
const int maxsize = 51;
int Neck[maxsize][maxsize];
int d[maxsize];
int degree[maxsize];
vector<pair<int,int> > vpi;
int n;
int find_father(int x)
{
if(d[x]==-1||d[x]==-2)
{
d[x]=-1;
return x;
}
return find_father(d[x]);
}
void Union(int a,int b)
{
int father_a=find_father(a);
int father_b=find_father(b);
if(father_a!=father_b)
d[father_a]=father_b;
}
bool isEuler()
{
int num=0;
for(int i=0;i<maxsize;++i)
{
if(degree[i]%2!=0)
return false;
if(d[i]==-1)
++num;
}
if(num!=1)
return false;
return true;
}
void euler(int x)
{
for(int i=0;i<maxsize;++i)
{
if(Neck[x][i]>0)
{
--Neck[x][i];
--Neck[i][x];
euler(i);
vpi.push_back(make_pair(x,i));
}
}
}
int main()
{
int cas;
while(cin>>cas)
{
for(int c=0;c<cas;++c)
{
cin>>n;
int i,j;
for(i=0;i<maxsize;++i)
{
degree[i]=0;
d[i]=-2;
}
memset(Neck,0,sizeof(Neck));
int a,b;
for(i=0;i<n;++i)
{
cin>>a>>b;
++degree[a];
++degree[b];
++Neck[a][b];
++Neck[b][a];
Union(a,b);
}
cout<<"Case #"<<c+1<<endl;
if(!isEuler())
cout<<"some beads may be lost"<<endl;
else
{
vpi.clear();
euler(a);
for(i=n-1;i>=0;--i)
cout<<vpi[i].first<<" "<<vpi[i].second<<endl;
}
if(c!=cas-1)
cout<<endl;
}
}
return 0;
}