AcWing 3225. 送货
原题链接
中等
作者:
把这题Ac了
,
2024-11-26 16:48:31
,
所有人可见
,
阅读 2
#include <iostream>
#include <cstring>
#include <algorithm>
#include <queue>
#include <vector>
#define x first
#define y second
using namespace std;
typedef pair<int,int> PII;
const int N = 1e4 + 10,M = 2e5 + 10;
int h[N],e[M],ne[M],idx;
int d[N],st[M],ans[M / 2],hh = 0;
int n,m;
void add(int a,int b){
e[idx] = b;
ne[idx] = h[a];
h[a] = idx++;
}
void dfs(int t){
vector<PII> stk;
for(int i = h[t];i != -1;i = ne[i]){
int j = e[i];
if(!st[i]){
stk.push_back({j,i});
}
}
sort(stk.begin(),stk.end());
for(auto &t : stk){
if(st[t.y]) continue;
/*
add(a,b) add(b,a); a->b b->a 这两个边是相邻的,所以可以用异或最后一位
来给两条边加上访问过!
*/
st[t.y] = st[t.y ^ 1] = 1;
dfs(t.x);
}
ans[++hh] = t;
}
int main(){
memset(h,-1,sizeof h);
cin >> n >> m;
//h数组时头插法,所以要想字典序按小开始的话,我们就排序后再插入
for(int i = 0;i < m;i++){
int a,b;
cin >> a >> b;
d[a]++,d[b]++;
add(a,b);add(b,a);
}
int tt = 0;
for(int i = 1;i <= n;i++)
if(d[i] % 2) tt++;
if(tt != 0 && tt != 2 || (tt == 2 && d[1] % 2 == 0)){
cout << -1 << endl;
return 0;
}
dfs(1);
if(hh < n){
cout << -1 << endl;
return 0;
}
for(int i = hh;i;i--){
cout << ans[i] << ' ';
}
cout << endl;
return 0;
}