1 条题解

  • 0
    @ 2026-6-13 10:58:26

    // 欧拉路径 欧拉回路 O(mlogm)
    #include<bits/stdc++.h>
    using namespace std;
    
    const int n=500,N=505;
    int m,du[N];
    stack<int> path;
    struct E{
      int to;  //终点
      int idx; //反边的终点的下标
      bool del; //删除标记
    };
    vector<E> e[N]; //邻接表
    int pos[N]; //pos[x]记录点x的下标编号
    int p[N];   //p[x]表示点x当前处理到第几条出边,初始值为0,相当于全局指针
    
    void dfs(int x){
      for(int i=p[x]; i<e[x].size(); i=p[x]){
        p[x]=i+1; //全局指针,指向下一条边
        E &a=e[x][i];
        if(!a.del){
          a.del=e[a.to][a.idx].del=true; //打删除标记
          dfs(a.to);
        }
      }
      path.push(x); //后序记录路径
    }
    int main(){
      scanf("%d",&m);
      for(int i=1,a,b; i<=m; ++i){
        scanf("%d %d",&a,&b);
        e[a].push_back({b,0,0});
        e[b].push_back({a,0,0});
        ++du[a]; ++du[b];
      }
      
      for(int i=1; i<=n; ++i)if(!e[i].empty())
        sort(e[i].begin(),e[i].end(),[&](E a,E b){return a.to<b.to;}); //点i的邻接点升序
      
      for(int i=1; i<=n; ++i)for(int j=0; j<e[i].size(); ++j)
        e[i][j].idx=pos[e[i][j].to]++; //记录e[i][j]的反边的终点的下标
      
      int start=1;
      while(!du[start]) start++; //排除度数为0的点
      for(int i=1; i<=n; i++)if(du[i]&1){ //查找度数为奇数的点
        start=i; break;
      }
      
      dfs(start);
    
      while(!path.empty())printf("%d\n",path.top()),path.pop();
    }
    
    • 1

    D164【模板】无向图 欧拉路径 欧拉回路 [USACO3.3] 骑马修栅栏 Riding the Fences

    信息

    ID
    1034
    时间
    1000ms
    内存
    128MiB
    难度
    7
    标签
    递交数
    146
    已通过
    29
    上传者