Esempio n. 1
0
int main(int argc, char const *argv[])
{
    Grafo grafo;
    std::unordered_map<std::string, Grafo::Ref> mapa;
    std::string linha;
    while (std::cin >> linha) {
        if (linha.length() == 0) {
            continue;
        }
        size_t separador = linha.find('>');
        if (separador == std::string::npos) {
            if (mapa.count(linha) == 0) {
                mapa[linha] = grafo.addVertice(linha);
            }
        } else {
            std::string primeiro = linha.substr(0, linha.find('>'));
            std::string segundo = linha.substr(linha.find('>')+1);
            if (mapa.count(primeiro) == 0) {
                mapa[primeiro] = grafo.addVertice(primeiro);
            }
            if (mapa.count(segundo) == 0) {
                mapa[segundo] = grafo.addVertice(segundo);
            }
            grafo.addAresta(mapa[primeiro], mapa[segundo]);
        }
    }
    
    if (argc == 2) {
        if (mapa.count(argv[1]) == 0) {
            std::cerr << "Erro!" << std::endl;
            std::cerr << "Não exite nó com o nome \"" << argv[1] << "\"!";
            std::cerr << std::endl;
            return 1;
        } else {
            grafo.drawGraph(mapa[argv[1]], std::cout);
            return 0;
        }
    } else {
        std::cerr << "Erro!" << std::endl;
        if (argc < 2) {
            std::cerr << "Argumentos insuficientes";
        } else {
            std::cerr << "Argumentos excedentes";
        }
        std::cerr << std::endl;
        
        return 1;
    }
}
int main(){


	int n, m;
	float peso1, peso2, peso3;
	int origem, destino; // vértices para cada aresta;
	int id = 0; // id das arestas que leremos do arquivo para criar o grafo
	cin>>n; // quantidade de vértices do grafo;
	cin>>m;
	my_grafo.setN(n);
	Grafo relacao(m); // como a relacao se dá no conjunto de arestas, entao a quantidade de vértices do Grafo relacao será a mesma quantidade de arestas de my_grafo  
	// contruir o grafo
	for (int i=0; i<n; i++){ // PADRAO : vértices numerados de 0 à n-1
		my_grafo.addVertice(i);
	}
	for (id = 0; id<m; id++){
		cin>>origem;
		cin>>destino;
		cin>>peso1;
		cin>>peso2;
		cin>>peso3;
		my_grafo.addAresta(id, origem, destino, peso1, peso2, peso3);
	}
	int nA = id; // quantidade de arestas do grafo	
	//cout<<m<<endl;
	id = 0;
	for (int i=0; i<m; i++){ // PADRAO : vértices numerados de 0 à n-1
		relacao.addVertice(i);
	}
	vector< pair<int, int> > relacao2; // primeira aresta domina a segunda
	while (cin>>origem){
		cin>>destino;
		relacao.addArestaDirecionada(id++, origem, destino); // nao nos preocupamos com os pesos para o grafo relacao
		relacao2.push_back(make_pair(origem, destino));
		// origem R destino
	}
	times(&tempsInit);


	// para medir o tempo em caso limite
	pthread_t thread_time; 
	pthread_attr_t attr;
	int nnnnnnnn=0;
	if(pthread_create(&thread_time, NULL, &tempo, (void*)nnnnnnnn)){ // on criee efectivement la thread de rechaufage
        cout<<"Error to create the thread"<<endl;
        //exit(-1);
        exit(EXIT_FAILURE);
    }
    //


	//vector< int * > arvores = 
	krukal_like(&my_grafo, relacao2);
	
	times(&tempsFinal);   /* current time */ // clock final
	clock_t user_time1 = (tempsFinal.tms_utime - tempsInit.tms_utime);
	cout<<user_time1<<endl;
	cout<<(float) user_time1 / (float) sysconf(_SC_CLK_TCK)<<endl;//"Tempo do usuario por segundo : "
   	
	cout<<"RESULTADO FINAL"<<endl;
	printResultado();
	

	return 0;
}