Pagini recente » Cod sursa (job #1915814) | Cod sursa (job #1346348) | Cod sursa (job #1691143) | Cod sursa (job #233629) | Cod sursa (job #2112554)
#include<cstdio>
#include<vector>
#include<stack>
#include<cctype>
#define BUF_SIZE 1 << 19
#define MAX_N 100000
using namespace std;
vector<int>g[MAX_N + 1], sol;
stack<int>st;
char buf[BUF_SIZE];
int degree[MAX_N + 1], n, m, pos = BUF_SIZE;
char getChar(FILE *fin) {
if(pos == BUF_SIZE) {
fread(buf,1,BUF_SIZE,fin);
pos = 0;
}
return buf[pos++];
}
inline int read(FILE *fin) {
int res = 0;
char ch;
do {
ch = getChar(fin);
}while(!isdigit(ch));
do {
res = 10*res + ch - '0';
ch = getChar(fin);
}while(isdigit(ch));
return res;
}
void readGraph() {
int x, y;
FILE *fin = fopen("ciclueuler.in","r");
n = read(fin); m = read(fin);
for(int i = 0; i < m; i++) {
x = read(fin); y = read(fin);
g[x].push_back(y);
g[y].push_back(x);
degree[x]++;
degree[y]++;
}
fclose(fin);
}
bool isEulerian() {
bool ok = true;
for(int i = 1; i <= n && ok; i++)
if(degree[i] & 1)
ok = false;
return ok;
}
void Euler(int u) {
vector<int>::iterator it;
int v;
st.push(u);
while(!st.empty()) {
u = st.top();
if(g[u].size() > 0) {
v = g[u].front();
g[u].erase(g[u].begin());
for(it = g[v].begin(); it != g[v].end() && (*it) != u; it++);
g[v].erase(it);
st.push(v);
} else {
st.pop();
sol.push_back(u);
}
}
}
void printCycle() {
int k;
FILE *fout = fopen("ciclueuler.out","w");
if(isEulerian()) {
Euler(1);
k = sol.size();
for(int i = 0; i < k - 1; i++)
fprintf(fout,"%d ",sol[i]);
fprintf(fout,"\n");
} else fprintf(fout,"-1\n");
fclose(fout);
}
int main() {
readGraph();
printCycle();
return 0;
}