关于欧拉回路
  • 板块学术版
  • 楼主___A__
  • 当前回复0
  • 已保存回复0
  • 发布时间2024/4/19 19:51
  • 上次更新2024/4/19 19:55:36
查看原帖
关于欧拉回路
275860
___A__楼主2024/4/19 19:51

为什么这样写为被自环卡掉 应该是线性才对

#include<bits/stdc++.h>
using namespace std;
const int N=1e5+5;
int typ,n,m,in[N],out[N],deg[N],vis[N*2];
struct graph{
    int v,id,anti;
};
int operator<(graph x,graph y){
    return 1;
}
set<graph>g[N];
vector<int>ans;
int dfs(int u,int typ){
    for(auto [v,id,anti]:g[u]){
        if(!vis[id]){
            vis[id]=1,g[u].erase({v,id,anti});
            if(typ==1){
                int tmp=anti;
                if(!tmp){
                    tmp=-1;
                }
                else{
                    tmp=0;
                }
                g[v].erase({u,id,tmp});
            }
            dfs(v,typ);
            if(typ==1){
                if(anti==-1){
                    ans.push_back(-id);
                }
                else{
                    ans.push_back(id);
                }
            }
            else{
                ans.push_back(id);
            }
        }
    }
}
int main(){
    cin>>typ>>n>>m;
    if(typ==1){//无向图
        for(int i=1,u,v;i<=m;i++){
            cin>>u>>v,deg[u]++,deg[v]++,g[u].insert({v,i,0}),g[v].insert({u,i,-1});
        }
        for(int i=1;i<=n;i++){
            if(deg[i]%2){
                cout<<"NO\n";
                return 0;
            }
        }
    }
    else{
        for(int i=1,u,v;i<=m;i++){
            cin>>u>>v,in[v]++,out[u]++,g[u].insert({v,i,0});
        }
        for(int i=1;i<=n;i++){
            if(in[i]!=out[i]){
                cout<<"NO\n";
                return 0;
            }
        }
    }
    for(int i=1;i<=n;i++){
        if(g[i].size()){
            dfs(i,typ);
            if(ans.size()!=m){
                cout<<"NO\n";
                return 0;
            }
            cout<<"YES\n";
            reverse(ans.begin(),ans.end());
            for(int i:ans){
                cout<<i<<" ";
            }
            return 0;
        }
    }
    if(n==1){
        cout<<"YES\n";
    }
    else{
        cout<<"NO\n";
    }
}
2024/4/19 19:51
加载中...