题意:求一个图的欧拉回路,将回路按照字典序最小输出
代码如下:
#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
#include<vector>
using namespace std;
const int maxn=2000;//dian
const int maxm=100000;//bian
bool vis[maxm];
int father[maxn];
vector<pair<int,int> > adj[maxn];
int getFather(int x)
{
return x==father[x]?x:father[x]=getFather(father[x]);
}
void add(int x,int y,int z)
{
adj[x].push_back(make_pair(z,y));
adj[y].push_back(make_pair(z,x));
}
vector <int> path;
#define eid first
#define vtx second
void dfs(int u)
{
for(int it=0;it<adj[u].size();++it)
{
if(!vis[adj[u][it].eid])
{
vis[adj[u][it].eid]=true;
dfs(adj[u][it].vtx);
path.push_back(adj[u][it].eid);
}
}
}
bool solve()
{
for(int i=0;i<maxn;++i){
father[i]=i;
}
for(int i=0;i<maxn;++i)
{
for(int j=0;j<adj[i].size();++j)
{
father[getFather(i)]=getFather(adj[i][j].second);
}
}
int origin=-1;
for(int i=0;i<maxn;++i)
{
if(adj[i].size())
{
if(adj[i].size()&1)return false;
if(origin==-1)origin=1;
if(getFather(i)!=getFather(origin))return false;
sort(adj[i].begin(),adj[i].end());
}
}
path.clear();
memset(vis,0,sizeof(vis));
if(origin!=-1)
{
dfs(origin);
}
reverse(path.begin(),path.end());
return true;
}
int main()
{
// freopen("data.txt","r",stdin);
while(1)
{
int x;int y;int z;
scanf("%d%d",&x,&y);
if(x==0&&y==0)break;
for(int i=0;i<maxn;++i) adj[i].clear();
scanf("%d",&z);
add(x,y,z);
while(scanf("%d%d",&x,&y))
{
if(x==0&&y==0)break;
scanf("%d",&z);
add(x,y,z);
}
if(solve())
{
for(int i=0;i<path.size();++i)
{
printf("%d ",path[i]);
}
printf("\n");
}
else printf("Round trip does not exist.\n");
}
return 0;
}
版权声明:本文为u010734277原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。