Problem:
n个节点m条路,看成一个无向图,判断能否每条路直走一次。
Solution:
先判断度,只能是1个或2个奇数度。
然后判断边的数目是否等于m,否则是非连通图。
然后按字典序最小遍历即可,此时一定会有一条回路。
#include <stdio.h>
#include <queue>
using namespace std;
const int max_v = 15;
int G[max_v][max_v];
int degree[max_v];
int n, start = 0, edge = 0;
queue<int> q;
bool okDeg() {//只能有0个或2个点是奇数个度
int odd = 0;
for (int i = 0; i < n; i++) {
if(degree[i]%2 != 0) {
odd++;
if(start != 0)
start = min(i, start);
}
if(odd > 2)
return false;
}
if(odd == 1)
return false;
else
return true;
}
void dfs(int root) {//判断无向图的连通性
edge++;
q.push(root);
for(int i = 0; i < n; i++) {
if(G[root][i]>0) {
G[root][i] = G[i][root] = 0;
dfs(i);
}
}
}
/*
4 6
1 2
1 3
1 4
2 4
3 4
2 3
*/
int main() {
// freopen("/Users/really/Documents/code/input","r",stdin);
memset(G, 0, sizeof(G));
int m;
scanf("%d%d", &n, &m);
for(int i = 0; i < m; i++) {
int a, b;
scanf("%d%d", &a, &b);
G[a-1][b-1] = G[b-1][a-1] = 1;
degree[a-1]++; degree[b-1]++;
}
if(!okDeg())
printf("-1\n");
else {
dfs(start);
if(edge-1 != m)
printf("-1\n");
else {
printf("%d", q.front()+1); q.pop();
while(!q.empty()) {
printf(" %d", q.front()+1);
q.pop();
}
printf("\n");
}
}
return 0;
}