Cod sursa(job #1758538)

Utilizator AcuasPopescu Nicolae-Aurelian Acuas Data 17 septembrie 2016 14:05:55
Problema Ciclu Eulerian Scor 20
Compilator cpp Status done
Runda Arhiva educationala Marime 1.29 kb
#include <fstream>
#include <vector>
#include <algorithm>
#define NMAX 100100
using namespace std;
ifstream f("ciclueuler.in");
ofstream g("ciclueuler.out");
int n,m,me,viz[NMAX],t[NMAX];
vector<int> G[NMAX];
vector<int> ciclu,cicluEULERIAN;
int stop;
void citire(){
	int i,x,y;
	f>>n>>m;
	for(i=1;i<=m;i++){
		f>>x>>y;
		G[x].push_back(y);
		G[y].push_back(x);
	}
}
void afisare(int nod){
	if(t[nod]){
		g<<nod<<' ';
		afisare(t[nod]);
	}
}
int find_cycle(int x){
	int T=0,z;
	int y=x;//nod curent
	while(T==0||y!=x){
		T++;
		ciclu.push_back(y);
		z=G[y][0];
		G[y].erase(G[y].begin());
		vector<int>::iterator p;
		p=find(G[z].begin(),G[z].end(),y);
		G[z].erase(p);
		y=z;
	}
	ciclu.push_back(x);
	return T;
}
int main(){
	citire();
	me=find_cycle(1);
	int i,j;
	for(i=0;i<ciclu.size();i++){
        cicluEULERIAN.push_back(ciclu[i]);
	}
	while(me<m){
		int aux,tmp;
		for(i=ciclu.size()-1;i>=0;i--){
			if(G[ciclu[i]].size()>0){
				aux=ciclu[i];
				break;
			}
		}
		ciclu.clear();
		tmp=find_cycle(aux);
		vector<int>::iterator p;
		p=find(cicluEULERIAN.begin(),cicluEULERIAN.end(),aux);
		cicluEULERIAN.insert(p,ciclu.begin(),ciclu.end()-1);
		me+=tmp;
	}
	for(i=0;i<cicluEULERIAN.size()-1;i++)
        g<<cicluEULERIAN[i]<<' ';
	return 0;
}