Cod sursa(job #2812777)

Utilizator YusufHawalYusuf Hawal YusufHawal Data 5 decembrie 2021 02:53:56
Problema Ciclu Eulerian Scor 0
Compilator java Status done
Runda Arhiva educationala Marime 2.47 kb
import java.io.*;
import java.lang.*;
import java.util.*;

class Edge {
	int u, v;
	public Edge(int _u, int _v) { u = _u; v = _v; }
	public int getU() {return u; }
	public int getV() {return v; }
}

class Graph {
	int n, m;
	Edge ve[];
	int d[];	// degree
	
	boolean visited[];
	//boolean te[];	// tree edge
	//int nrvis;
	
	boolean ok;
	ArrayList<Integer> al[];
	
	
	public Graph(int _n, int _m) {
		n = _n; m = _m;
		ve = new Edge[m];
	}
	
	void Dfs(int x) {
		//++nrvis;
		//visited[x] = true;
		for(int i = 0; i < al[x].size(); ++i) {
			int p = al[x].get(i);
			if(!visited[p]) {
				visited[p] = true;
			//	te[p] = true;
			//	int y = 
			}
		}
	}
	
	void Euler(int u) {
		
		
	}
	
	ArrayList<Integer> solve() {
		// degree and adiacency lists
		d = new int[n + 1];
		al = new ArrayList[n + 1];
		for(int i = 1; i <= n; ++i)
			al[i] = new ArrayList<Integer>();
		for(int i = 0; i < m; ++i) {
			int u = ve[i].getU();
			int v = ve[i].getV();
			++d[u];
			++d[v];
			al[u].add(i);
			al[v].add(i);
		}
		
		ArrayList<Integer> res = new ArrayList<Integer>();
		ok = true;
		for(int i = 1; i <= n; ++i)
			if(d[i] == 0 || (d[i] % 2 != 0)) {
				ok = false;
				res.add(-1);
				return res;
			}
		//te = new boolean[m];
		//nrvis = 0;
		visited = new boolean[m];
		ArrayList<Integer> q = new ArrayList<Integer> ();
		q.add(1);
		while(q.size() > 0) {
			int node = q.get(q.size() - 1);
			if(al[node].size() > 0) {
				int e = al[node].get(al[node].size() - 1);
				al[node].remove(al[node].size() - 1);
				if(!visited[e]) {
					visited[e] = true;
					int y = ve[e].getU() ^ ve[e].getV() ^ node;
					q.add(y);
				}
			} else {
				q.remove(q.size() - 1);
				res.add(node);
			}
		}
		return res;
	}
	
	public static void main(String[] args) throws Exception {
		BufferedReader br = new BufferedReader(new FileReader("ciclueuler.in"));
		String[] vs = br.readLine().split(" ");
		int n = Integer.parseInt(vs[0]);
		int m = Integer.parseInt(vs[1]);
		Graph g = new Graph(n, m);
		
		for(int i = 0; i < m; ++i) {
			vs = br.readLine().split(" ");
			g.ve[i] = new Edge(Integer.parseInt(vs[0]), Integer.parseInt(vs[1]));
		}
		ArrayList<Integer> r = g.solve();
		BufferedWriter out = new BufferedWriter(new FileWriter("ciclueuler.out"));
		StringBuilder sb = new StringBuilder();
		for(int i = 0; i < r.size() - 1; ++i)
			sb.append(r.get(i)).append(" ");
		out.write(sb.toString());
		out.close();
	}
}