2 条题解
-
0
正确方法:
#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
#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
- 上传者