John's trip UVA - 302 (欧拉路径字典序输出路径编号)

传送门

题解:这个题还是先建立个邻接表,只不过在之前把所有邻接表都按照街道编号的大小都排了一次序,然后再进行欧拉路径的逆序输出


//拓扑排序输出边的序号
#include<iostream>
#include<cstdio>
#include<vector>
#include<cstring>
#include<algorithm>

using namespace std;

const int N=2000;

int deg[N];
vector<pair<int,int> >adjlist[N];
bool vis[N];
int ans[N];
int top;
int start;

void add(int x,int y,int z)
{
    adjlist[x].push_back(make_pair(z,y));
    adjlist[y].push_back(make_pair(z,x));
}

bool input()
{
    int x,y,z;
    scanf("%d%d",&x,&y);
    if(x==0&&y==0){
        return false;
    }
    start=min(x,y);
    for(int i=0;i<N;i++){
        adjlist[i].clear();
    }
    memset(deg,0,sizeof(deg));
    while(1){
        scanf("%d",&z);
        add(x,y,z);
        deg[x]++;
        deg[y]++;
        scanf("%d%d",&x,&y);
        if(x==0&&y==0){
            break;
        }
    }
    return true;
}

void dfs(int u)
{
    for(int i=0;i<adjlist[u].size();i++){
        if(!vis[adjlist[u][i].first]){
            vis[adjlist[u][i].first]=true;
            dfs(adjlist[u][i].second);
            ans[top++]=adjlist[u][i].first;
        }
    }
}

void solve()
{
    bool ok=true;
    for(int i=0;i<N;i++){
        if(!adjlist[i].empty()){
            if(deg[i]&1){
                ok=false;
                break;
            }
            sort(adjlist[i].begin(),adjlist[i].end());
        }
    }
    if(!ok){
        printf("Round trip does not exist.\n\n");
        return ;
    }
    top=0;
    memset(vis,false,sizeof(vis));
    dfs(start);
    for(int i=top-1;i>=0;i--){
        printf("%d%s",ans[i],i?" ":"\n\n");
    }
}

int main()
{
    while(input()){
        solve();
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/zhouzi2018/article/details/81199135
今日推荐