Cod sursa(job #1424291)

Utilizator gabordragosGabor Dragos-Alexandru gabordragos Data 23 aprilie 2015 21:03:33
Problema Diametrul unui arbore Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 2.54 kb
#include<iostream>
#include<vector>
#include<fstream>

using namespace std;

vector <vector<int>> graf;
int nrNoduri, nrMuchii;

void afisareGraf(){
	int i, j;
	cout << "\n"<<nrNoduri<<" "<<nrMuchii<<"\n";
	for (i = 1; i < graf.size(); i++){
		cout << " Nodul " << i << " are vecinii: ";
		for (j = 0; j < graf[i].size(); j++){
			cout << graf[i][j] << " ";
		}
		cout << "\n";
	}
}

void citire(){
	int n, x, y;
	fstream f("darb.in");
	f >> nrNoduri;
	nrMuchii = 0;
	n = nrNoduri;
	while (n--){
		graf.push_back(*(new vector<int>));
	}
	graf.push_back(*(new vector<int>));
	while (!f.eof()){
		f >> x >> y;
		cout << x << " " << y << "\n";
		graf[x].push_back(y);
		graf[y].push_back(x);
		nrMuchii++;
	}
	f.close();
}

bool magie(){
	if (nrNoduri - 1 != nrMuchii){
		cout << "Nu e un arbore!";
		return false;
	}
	else{
		int vazut[100];
		for (int i = 0; i <= nrNoduri; i++){
			vazut[i] = 0;
		}
		int parinte[100];
		int coada[100];
		int p, u;
		int a, b;
		p = 0; u = 0;
		coada[u] = 1;
		u++;
		vazut[1] = 1;
		parinte[1] = 0;
		while (p < u){
			int x = coada[p];
			cout << x <<" ";
			p++;
			for (int i = 0; i < graf[x].size(); i++){
				if (vazut[graf[x][i]] && graf[x][i]!=parinte[x]){
					cout << "Graficul nu este arbore!";
					return false;
				}
				else if(graf[x][i]!=parinte[x]){
					vazut[graf[x][i]] = 1;
					parinte[graf[x][i]] = x;
					coada[u] = graf[x][i];
					u++;
				}
			}
		}
		for (int i = 1; i <= nrNoduri; i++){
			if (vazut[i] == 0){
				cout << "GRAFICUL NU E CONEX";
				return false;
			}
		}
		for (int i = 0; i <= nrNoduri; i++){
			vazut[i] = 0;
		}
		a = coada[u - 1];
		p = 0;
		coada[p] = coada[u - 1];
		u = 1;
		parinte[coada[p]] = 0;
		int k = 0,q = 0;
		cout << "\n";
		while (p < u){
			int x = coada[p];
			cout << x << " ";
			k = vazut[x];
			p++;
			for (int i = 0; i < graf[x].size(); i++){
				if (graf[x][i] != parinte[x]){
					parinte[graf[x][i]] = x;
					coada[u] = graf[x][i];
					vazut[graf[x][i]] = k + 1;
					u++;
				}
			}
		}
		b = coada[u - 1];
		k = vazut[b];
		cout << "\nCentrul are numarul " << k<<"\n";
		for (int i = 1; i <= nrNoduri; i++){
			if (k % 2 != 0){
				if (vazut[i] == k / 2 || vazut[i] == k / 2 + 1)
					cout << "Nodul " << i << " apartine centrului\n";
			}
			else
				if (vazut[i] == k/2)
					cout << "Nodul " << i << " apartine centrului\n";

			
		}
		fstream f("darb.out");
		f << k + 1;
		f.close();
	}
	return true;
}

int main(){
	citire();
	magie();
	cout << "\n";
}