2 条题解

  • 0
    @ 2024-12-18 17:02:52

    正确方法:

    #include <bits/stdc++.h>
    using namespace std;
    
    struct Edge {
        int to;
        int id;
    };
    
    int main() {
        ios::sync_with_stdio(false);
        cin.tie(nullptr);
    
        int n, m; 
        cin >> n >> m;
    
        vector<vector<Edge>> adj(n+1);
        vector<int> degree(n+1, 0);
        // 我们有 m 条无向边,每条边有唯一id
        for (int i = 0; i < m; i++) {
            int u, v; 
            cin >> u >> v;
            adj[u].push_back({v, i});
            adj[v].push_back({u, i});
            degree[u]++, degree[v]++;
        }
    
        // 判断奇度顶点数
        int oddCount = 0;
        int start = 1;
        for (int i = 1; i <= n; i++) {
            if (degree[i] % 2 == 1) {
                oddCount++;
                start = i; 
            }
        }
    
        if (oddCount != 0 && oddCount != 2) {
            // 没有欧拉路径或回路
            // 根据题意,这里不给出具体错误信息,可自行决定
            // 我们输出空行表示无解
            cout << "\n";
            return 0;
        }
    
        vector<bool> used(m, false); // 标记边是否使用过
    
        stack<int> stk; 
        vector<int> path;
        stk.push(start);
    
        // 使用 Hierholzer 算法
        // 每个点的邻接边需要重复检查末尾边是否未用
        // 我们使用一个额外的栈记录路径,直到没有可用边为止
        vector<int> idx(n+1, 0); 
        // idx[u] 用于记录当前访问 u 的邻接边索引(相当于手动的迭代器)
    
        while(!stk.empty()) {
            int u = stk.top();
            // 找到u的下一条未使用边
            int &i = idx[u];
            while (i < (int)adj[u].size() && used[adj[u][i].id]) i++;
            if (i == (int)adj[u].size()) {
                // 没有可走的边了,将u加入path
                path.push_back(u);
                stk.pop();
            } else {
                // 使用这条边
                Edge &e = adj[u][i];
                used[e.id] = true;
                stk.push(e.to);
            }
        }
    
        // 输出结果
        for (int i = 0; i < (int)path.size(); i++) {
            cout << path[i] << (i+1 == (int)path.size() ? '\n' : ' ');
        }
    
        return 0;
    }
    
    • 0
      @ 2024-11-11 23:02:53
      #include <bits/stdc++.h>
      #define INF 0x3f3f3f3f
      #define PI acos(-1.0)
      #define N 501
      #define MOD 123
      #define E 1e-6
      using namespace std;
      int n,m;
      int g[N][N];
      int dis[N],path[N*2];
      int cnt;
      void dfs(int i)
      {
          for(int j=1;j<=n;j++)
              if(g[i][j])
              {
                  g[i][j]=0;
                  g[j][i]=0;
                  dfs(j);
              }
          path[cnt++]=i;
      }
      int main()
      {
          cin>>n>>m;
          for(int i=1;i<=m;i++)
          {
              int x,y;
              cin>>x>>y;
              g[x][y]=1;
              g[y][x]=1;
              dis[x]++;
              dis[y]++;
          }
      
          int start=1;
          int sum=0;
          for(int i=1;i<=n;i++)
              if(dis[i]%2)
              {
                  sum++;
                  if(sum==1)
                      start=i;
              }
      
          dfs(start);
      
          for(int i=cnt-1;i>=0;i--)
              cout<<path[i]<<" ";
          return 0;
      }
      
      
      • 1

      信息

      ID
      819
      时间
      1000ms
      内存
      256MiB
      难度
      10
      标签
      递交数
      3
      已通过
      1
      上传者