Cod sursa(job #2205632)

Utilizator Andreea_DanielaAndreea Guster Andreea_Daniela Data 19 mai 2018 18:13:31
Problema Arbore partial de cost minim Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.71 kb
#include <fstream>
#include <iostream>
#include <algorithm>
#include <queue>
#include <vector>
#define infinit INT32_MAX
using namespace std;



void afis(pair<pair<int,int>,double> m, ofstream &g){
    g<<m.first.first<<" "<<m.first.second<<endl;
}


double cost_total = 0;

void Prim(int s, int n, vector<pair<int,double>> *la,  vector<pair<pair<int,int>,double>> &muchii_apcm){
	int u,  *tata, *viz,v,j;
	double *d,w_uv;

	d=new double[n+1];
	tata=new int[n+1];
	viz=new int[n+1];

	for(u=1;u<=n;u++){
		viz[u]=tata[u]=0;
		d[u]=infinit;
	}
	d[s]=0;

    //priority_queue <muchie_min_varf> Q;

	priority_queue <pair<double,int>> Q;
	Q.push({-d[s],s});
	while(!Q.empty()){

		u=Q.top().second;
	    Q.pop();
		viz[u]++;


		if(viz[u]==1){

			for(j=0;j< la[u].size();j++){
			    v=la[u][j].first;
			    w_uv=la[u][j].second;
				if(viz[v]==0) {
					if(d[v]>w_uv){
						tata[v]=u;
						d[v]=w_uv;
	  				    Q.push(make_pair(-d[v],v)); //adaug noua pereche v,d[v]
	  				}
				}
		    }

		}
	}

	for(u=1;u<=n;u++)
		if(tata[u]!=0) {cost_total+= d[u];
			muchii_apcm.push_back( {{u,tata[u]},d[u]}); }
}
int main(){
	fstream f("apcm.in");
	ofstream g("apcm.out");
	int m,n, x,y,i,mc;
	double c;
	vector<pair<int,double> > *la;
	f>>n;
	f>>m;
	la=new vector<pair<int,double> >[n+1];

	for(i=1;i<=m;i++){
		f>>x>>y>>c;
		la[x].push_back(make_pair(y,c));
		la[y].push_back(make_pair(x,c));
	}
	f.close();



    vector<pair<pair<int,int>,double> > muchii_apcm;

    Prim(1,n,la,muchii_apcm);

    g<< cost_total<<endl << muchii_apcm.size() << endl;
    	for(mc=0;mc<muchii_apcm.size();mc++){
			afis(muchii_apcm[mc],g);

	}
    g.close();

	return 0;

}