Ejemplo n.º 1
0
void MainWindow::on_BTNkruskal_clicked()
{
    layout->removeWidget(label);
    kruskal.resolver();
    kruskal.print();
    layout->addWidget(label);
}
Ejemplo n.º 2
0
Archivo: main.cpp Proyecto: grzsz/MST
int main(int argc, char** argv)
{
	if (argc != 2)
	{
		printUsage();
		return 0;
	}

	Kruskal kruskal;
	if (!kruskal.loadGraphFromFile(argv[1]))
	{
		cout << "Cannot load data from " << argv[1] << "\n";
		return 0;
	}

	//cout << "original graph:\n";
	//kruskal.printGraphAsMatrix();

	graphUtils::GraphAsMatrix mst = kruskal.getMinimumSpanningTree();
	//cout << "MST graph:\n";
	//utils::printGraphAsMatrix(mst);
	int originalGraphWeight = kruskal.getGraphWeight();
	int mstWeight = graphUtils::getGraphWeight(mst);
	graphUtils::printGraphAsMatrixToFile("kruskal.out", mst);
	cout << "original weight: " << originalGraphWeight << " mst weight: " << mstWeight << " saving: " << (originalGraphWeight - mstWeight) << "\n";

	return 0;
}
Ejemplo n.º 3
0
	///求小于等于k度的最小限度生成树,返回生成树大小,-1表示无法完成!
	int k_degree_mst(int n, int k) {	///定点数[0, n)	包含度限制的那个点。要限制的度数k
		if(E0.size() < k)	k = E0.size();
		/**如果要求正好是k度,换成这个
		if(E0.size() < k) {
			result = -1;
			return -1;
		}
		*/
		kr.kruskal(n);
		tmpE0.clear();
		result = kr.result;
		
		int part = 0;
		sort(E0.begin(), E0.end());
		for(I i = E0.begin(); i != E0.end(); i ++) {
			if(unio(v0, i->second) != -1){
				kr.tree[v0].push_back(T(i->first, i->second));
				kr.tree[i->second].push_back(T(i->first, v0));
				
				part ++;
				result += i->first;
			} else {
				tmpE0.push_back(*i);
			}
		}
		if(part!=kr.part-1||part>k)	return minResult=-1;//分别对应v0度不够、度大于限度
		//初始化完毕
		minResult = result;
		for(int i = 0; i < k-part; i ++)
			extend_degree();
		return minResult;
	}
Ejemplo n.º 4
0
int main(int argc, char const *argv[]) {
    ios::sync_with_stdio(false);

    int t;
    Kruskal *K;

    cin >> t;
    for (int cs = 0; cs < t; ++cs) {
        int n;
        ll r;
        cin >> n >> r;
        VL x(n), y(n);
        K = new Kruskal(n);

        for (int i = 0; i < n; ++i) {
            cin >> x[i] >> y[i];
            for (int j = 0; j < i; ++j) {
                K->addEdge(i, j, (x[i] - x[j]) * (x[i] - x[j]) + (y[i] - y[j]) * (y[i] - y[j]));
            }
        }

        vector <pair <ll, PI>> mst;
        K->MST(&mst);
        int state = 1;
        double road = 0.0, rail = 0.0;
        for (auto e : mst) {
            if (e.x <= r * r) {
                road += sqrt(double(e.x));
            } else {
                rail += sqrt(double(e.x));
                state++;
            }
        }

        cout << "Case #" << cs + 1 << ": " << state << ' ' << int(road + 0.5) << ' ' << int(rail + 0.5) << endl;
    }

    return 0;
}
Ejemplo n.º 5
0
int _tmain(int argc, _TCHAR* argv[])
{
	string file = "adjacencyMatrix.txt";
	Graph G;
	G.LoadGraph(file,1);

	cout<<"*********************************************************\n";
	cout<<"\t\tVisit Graph\n";
	cout<<"*********************************************************\n";
	G.BreadthFirstSearch();
	G.DepthFirstSearch();

	string file2 = "weightedAdjacencyMatrix.txt";
	G.LoadGraph(file2,2);

	cout<<"*********************************************************\n";
	cout<<"\t\tMinimum spanning tree\n";
	cout<<"*********************************************************\n";
	Kruskal k;
	k.MSTKruskal(G.vertexNumber,G.weightedAdjacencyMatrix);

	Prim p;
	int startVertex = 0;
	p.MSTPrim(G.vertexNumber,G.weightedAdjacencyMatrix,startVertex);

	string file3 = "weightedDirectedGraph.txt";
	G.LoadGraph(file3,3);

	cout<<"*********************************************************\n";
	cout<<"\t\tSingle-source shortest path \n";
	cout<<"*********************************************************\n";
	Dijkstra d;
	d.SSSPDijkstra(G.vertexNumber,G.weightedDirectedAdjacencyMatrix,startVertex);

	return 0;
}
Ejemplo n.º 6
0
	void addEdge(int a, int b, int val) {
		if(a == v0 || b == v0)
			E0.push_back(T(val, a+b-v0));//a+b-v0即为另外一条边!
		else 
			kr.addEdge(a, b, val);
	}
Ejemplo n.º 7
0
	void init(int v0) {
		th(v0);
		E0.clear();
		kr.init();
	}
Ejemplo n.º 8
0
MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    setWindowTitle("Map Path Simulator");
    ui->mapa->setPixmap(QPixmap(":/Images/mapa.png"));
    layout = new QVBoxLayout(this);
    //for(int i = 0; i < 54; i++)
    //{
        //label = new QLabel("hola");
        //QString hola;
        //hola.append("hola");
        //label->setText(hola);
        //layout->addWidget(label);
    //}
    ui->scrollAreaWidgetContents->setLayout(layout);

    Nodo * nodos[54];

    nodos[0]=new Nodo("Santa Fe", 0);
    nodos[1]=new Nodo("San Jorge",1);
    nodos[2]=new Nodo("Nueva Ocotepeque", 2);
    nodos[3]=new Nodo("Copan Ruinas",3);
    nodos[4]=new Nodo("Santa Rosa de Copan", 4);
    nodos[5]=new Nodo("Florida", 5);
    nodos[6]=new Nodo("Gracias", 6);
    nodos[7]=new Nodo("Belen", 7);
    nodos[8]=new Nodo("San Andres", 8);
    nodos[9]=new Nodo("Trinidad", 9);
    nodos[10]=new Nodo("Ilama", 10);
    nodos[11]=new Nodo("Santa Barbara", 11);
    nodos[12]=new Nodo("La Esperanza", 12);
    nodos[13]=new Nodo("Dolores", 13);
    nodos[14]=new Nodo("San Antonio", 14);
    nodos[15]=new Nodo("Puerto Cortes", 15);
    nodos[16]=new Nodo("San Pedro Sula", 16);
    nodos[17]=new Nodo("Santa Cruz de Yojoa", 17);
    nodos[18]=new Nodo("Minas de Oro", 18);
    nodos[19]=new Nodo("Taulabe", 19);
    nodos[20]=new Nodo("Comayagua", 20);
    nodos[21]=new Nodo("La Paz", 21);
    nodos[22]=new Nodo("Santa Maria", 22);
    nodos[23]=new Nodo("Cabanas", 23);
    nodos[24]=new Nodo("Tela", 24);
    nodos[25]=new Nodo("Esparta", 25);
    nodos[26]=new Nodo("La Ceiba", 26);
    nodos[27]=new Nodo("El Progreso", 27);
    nodos[28]=new Nodo("Yoro", 28);
    nodos[29]=new Nodo("Olanchito", 29);
    nodos[30]=new Nodo("San Ignacio", 30);
    nodos[31]=new Nodo("San Juan de Flores", 31);
    nodos[32]=new Nodo("Tegucigalpa", 32);
    nodos[33]=new Nodo("Caridad", 33);
    nodos[34]=new Nodo("Nacaome", 34);
    nodos[35]=new Nodo("Amapala", 35);
    nodos[36]=new Nodo("San Isidro", 36);
    nodos[37]=new Nodo("Choluteca", 37);
    nodos[38]=new Nodo("El Triunfo",38);
    nodos[39]=new Nodo("Soledad", 39);
    nodos[40]=new Nodo("Yuscaran", 40);
    nodos[41]=new Nodo("Danli", 41);
    nodos[42]=new Nodo("Juticalpa", 42);
    nodos[43]=new Nodo("San Esteban", 43);
    nodos[44]=new Nodo("Catacamas", 44);
    nodos[45]=new Nodo("Balfate", 45);
    nodos[46]=new Nodo("Trujillo", 46);
    nodos[47]=new Nodo("Iriona", 47);
    nodos[48]=new Nodo("Brus Laguna", 48);
    nodos[49]=new Nodo("Ahuas", 49);
    nodos[50]=new Nodo("Puerto Lempira", 50);
    nodos[51]=new Nodo("Utila", 51);
    nodos[52]=new Nodo("Roatan", 52);
    nodos[53]=new Nodo("Guanaja", 53);

    nodos[0]->addArista(new Arista(2, 12.023));

    nodos[1]->addArista(new Arista(2, 33.386));
    nodos[1]->addArista(new Arista(4, 93.037));

    nodos[2]->addArista(new Arista(0, 12.023));
    nodos[2]->addArista(new Arista(1, 33.386));

    nodos[3]->addArista(new Arista(4, 71.853));
    nodos[3]->addArista(new Arista(5, 53.509));

    nodos[4]->addArista(new Arista(1, 93.037));
    nodos[4]->addArista(new Arista(3, 71.853));
    nodos[4]->addArista(new Arista(5, 53.802));
    nodos[4]->addArista(new Arista(6, 47.190));

    nodos[5]->addArista(new Arista(3, 53.509));
    nodos[5]->addArista(new Arista(4, 53.802));
    nodos[5]->addArista(new Arista(9, 100.935));

    nodos[6]->addArista(new Arista(4, 47.190));
    nodos[6]->addArista(new Arista(7, 17.279));

    nodos[7]->addArista(new Arista(6, 17.279));
    nodos[7]->addArista(new Arista(12, 63.263));

    nodos[8]->addArista(new Arista(13, 35.946));
    nodos[8]->addArista(new Arista(14, 89.514));

    nodos[9]->addArista(new Arista(5, 100.935));
    nodos[9]->addArista(new Arista(10, 14.955));
    nodos[9]->addArista(new Arista(16, 73.837));

    nodos[10]->addArista(new Arista(9, 14.955));
    nodos[10]->addArista(new Arista(11, 18.0));

    nodos[11]->addArista(new Arista(10, 18.0));
    nodos[11]->addArista(new Arista(19, 60.4));

    nodos[12]->addArista(new Arista(7, 63.263));
    nodos[12]->addArista(new Arista(13, 45.453));
    nodos[12]->addArista(new Arista(22, 61.248));

    nodos[13]->addArista(new Arista(8, 35.946));
    nodos[13]->addArista(new Arista(12, 45.453));
    nodos[13]->addArista(new Arista(14, 67.302));

    nodos[14]->addArista(new Arista(8, 89.514));
    nodos[14]->addArista(new Arista(13, 67.302));

    nodos[15]->addArista(new Arista(16, 51.125));

    nodos[16]->addArista(new Arista(9, 14.955));
    nodos[16]->addArista(new Arista(15, 51.125));
    nodos[16]->addArista(new Arista(27, 30.536));

    nodos[17]->addArista(new Arista(19, 45.377));
    nodos[17]->addArista(new Arista(27, 56.686));

    nodos[18]->addArista(new Arista(28, 87.2));

    nodos[19]->addArista(new Arista(11, 60.4));
    nodos[19]->addArista(new Arista(17, 45.377));
    nodos[19]->addArista(new Arista(20, 58.6));

    nodos[20]->addArista(new Arista(19, 58.6));
    nodos[20]->addArista(new Arista(21, 23.7));
    nodos[20]->addArista(new Arista(32, 89.9));

    nodos[21]->addArista(new Arista(20, 23.7));
    nodos[21]->addArista(new Arista(22, 54.3));

    nodos[22]->addArista(new Arista(12, 61.248));
    nodos[22]->addArista(new Arista(21, 54.3));
    nodos[22]->addArista(new Arista(23, 46.883));

    nodos[23]->addArista(new Arista(22, 46.883));

    nodos[24]->addArista(new Arista(27, 67.039));
    nodos[24]->addArista(new Arista(25, 47.602));

    nodos[25]->addArista(new Arista(24, 47.602));
    nodos[25]->addArista(new Arista(26, 81.709));

    nodos[26]->addArista(new Arista(25, 81.709));
    nodos[26]->addArista(new Arista(45, 47.762));
    nodos[26]->addArista(new Arista(52, 67.48));

    nodos[27]->addArista(new Arista(16, 30.536));
    nodos[27]->addArista(new Arista(17, 56.686));
    nodos[27]->addArista(new Arista(24, 67.039));
    nodos[27]->addArista(new Arista(28, 131));

    nodos[28]->addArista(new Arista(18, 87.2));
    nodos[28]->addArista(new Arista(27, 131));
    nodos[28]->addArista(new Arista(29, 107));
    nodos[28]->addArista(new Arista(30, 119));

    nodos[29]->addArista(new Arista(28, 107));
    nodos[29]->addArista(new Arista(45, 90.834));

    nodos[30]->addArista(new Arista(28, 119));
    nodos[30]->addArista(new Arista(31, 68.150));
    nodos[30]->addArista(new Arista(42, 154.583));

    nodos[31]->addArista(new Arista(30, 68.150));
    nodos[31]->addArista(new Arista(32, 51.190));

    nodos[32]->addArista(new Arista(20, 89.9));
    nodos[32]->addArista(new Arista(31, 51.190));
    nodos[32]->addArista(new Arista(34, 104.026));
    nodos[32]->addArista(new Arista(40, 67.453));

    nodos[33]->addArista(new Arista(34, 63.920));

    nodos[34]->addArista(new Arista(32, 104.026));
    nodos[34]->addArista(new Arista(33, 63.920));
    nodos[34]->addArista(new Arista(35, 48.184));
    nodos[34]->addArista(new Arista(36, 36.191));
    nodos[34]->addArista(new Arista(37, 56.6));

    nodos[35]->addArista(new Arista(34, 48.184));

    nodos[36]->addArista(new Arista(34, 36.191));

    nodos[37]->addArista(new Arista(34, 56.6));
    nodos[37]->addArista(new Arista(38, 40.3));
    nodos[37]->addArista(new Arista(39, 46.4));

    nodos[38]->addArista(new Arista(37, 40.3));

    nodos[39]->addArista(new Arista(37, 46.4));

    nodos[40]->addArista(new Arista(32, 67.453));
    nodos[40]->addArista(new Arista(41, 63.925));

    nodos[41]->addArista(new Arista(40, 63.925));

    nodos[42]->addArista(new Arista(30, 154.583));
    nodos[42]->addArista(new Arista(43, 107.091));
    nodos[42]->addArista(new Arista(44, 44.010));

    nodos[43]->addArista(new Arista(42, 107.091));
    nodos[43]->addArista(new Arista(46, 125.806));
    nodos[43]->addArista(new Arista(47, 172.791));

    nodos[44]->addArista(new Arista(42, 44.010));

    nodos[45]->addArista(new Arista(26, 47.762));
    nodos[45]->addArista(new Arista(29, 90.834));
    nodos[45]->addArista(new Arista(46, 132.361));

    nodos[46]->addArista(new Arista(43, 125.806));
    nodos[46]->addArista(new Arista(45, 132.361));
    nodos[46]->addArista(new Arista(47, 124.621));

    nodos[47]->addArista(new Arista(43, 172.791));
    nodos[47]->addArista(new Arista(46, 124.621));
    nodos[47]->addArista(new Arista(48, 62.56));

    nodos[48]->addArista(new Arista(47, 62.56));
    nodos[48]->addArista(new Arista(49, 37.67));

    nodos[49]->addArista(new Arista(48, 37.67));
    nodos[49]->addArista(new Arista(50, 66.80));

    nodos[50]->addArista(new Arista(49, 66.80));

    nodos[51]->addArista(new Arista(52, 49.08));

    nodos[52]->addArista(new Arista(26, 67.48));
    nodos[52]->addArista(new Arista(51, 49.08));
    nodos[52]->addArista(new Arista(53, 70.96));

    nodos[53]->addArista(new Arista(52, 70.96));

    sps.setX(235);sps.setY(280-20);
    santacruzdeyojoa.setX(266);santacruzdeyojoa.setY(355-20);
    puertocortes.setX(258);puertocortes.setY(233-20);

    progreso.setX(275);progreso.setY(322-20);
    yoro.setX(370);yoro.setY(342-20);
    olanchito.setX(459);olanchito.setY(288-20);

    tela.setX(291);tela.setY(241-20);
    esparta.setX(352);esparta.setY(250-20);
    ceiba.setX(424);ceiba.setY(243-20);

    balfate.setX(507);balfate.setY(248-20);
    trujillo.setX(554);trujillo.setY(222-20);
    iriona.setX(683);iriona.setY(226-20);

    sanesteban.setX(595);sanesteban.setY(302-20);
    juticalpa.setX(490);juticalpa.setY(377-20);
    catacamas.setX(630);catacamas.setY(427-20);

    danli.setX(493);danli.setY(511-20);
    soledad.setX(378);soledad.setY(586-20);
    yuscaran.setX(415);yuscaran.setY(533-20);

    sanisidro.setX(342);sanisidro.setY(582-20);
    choluteca.setX(360);choluteca.setY(632-20);
    eltriunfo.setX(389);eltriunfo.setY(668-20);

    nacaome.setX(316);nacaome.setY(598-20);
    amapala.setX(289);amapala.setY(638-20);
    caridad.setX(287);caridad.setY(559-20);

    santamaria.setX(247);santamaria.setY(498-20);
    lapaz.setX(287);lapaz.setY(473-20);
    cabanas.setX(240);cabanas.setY(527-20);

    dolores.setX(192);dolores.setY(490-20);
    laesperanza.setX(210);laesperanza.setY(476-20);
    sanantonio.setX(167);sanantonio.setY(536-20);

    sanandres.setX(173);sanandres.setY(502-20);
    gracias.setX(151);gracias.setY(431-20);
    belen.setX(158);belen.setY(451-20);

    sanjorge.setX(71);sanjorge.setY(427-20);
    ocotepeque.setX(56);ocotepeque.setY(451-20);
    santafe.setX(36);santafe.setY(450-20);

    santarosadecopan.setX(118);santarosadecopan.setY(398-20);
    florida.setX(108);florida.setY(339-20);
    copanruinas.setX(69);copanruinas.setY(381-20);

    trinidad.setX(195);trinidad.setY(312-20);
    santabarbara.setX(203);santabarbara.setY(375-20);
    ilama.setX(192);ilama.setY(338-20);

    taulabe.setX(241);taulabe.setY(405-20);
    comayagua.setX(295);comayagua.setY(455-20);
    minasdeoro.setX(305);minasdeoro.setY(366-20);

    sanignacio.setX(382);sanignacio.setY(387-20);
    sanjuandeflores.setX(411);sanjuandeflores.setY(476-20);
    tegucigalpa.setX(358);tegucigalpa.setY(510-20);

    roatan.setX(457);roatan.setY(155-20);
    utila.setX(399);utila.setY(192-20);
    guanaja.setX(557);guanaja.setY(132-20);

    bruslaguna.setX(766);bruslaguna.setY(246-20);
    puertolempira.setX(880);puertolempira.setY(323-20);
    ahuas.setX(799);ahuas.setY(279-20);

    for(int i = 0; i < 54; i++)
    {
        //QString temp = QString(nodos[i]->ciudad);
        ui->DBsrc->addItem(QString::fromStdString(nodos[i]->ciudad));
        ui->DBdest->addItem(QString::fromStdString(nodos[i]->ciudad));
    }

    for(int i = 0; i < 54; i++)
    {
        dijkstra.agregarNodo(nodos[i]);
        floyd.agregarNodo(nodos[i]);
        kruskal.addNodo(nodos[i]);
    }

}