Pagini recente » Cod sursa (job #2043128) | Cod sursa (job #2613931) | Cod sursa (job #2488701) | Cod sursa (job #2494200) | Cod sursa (job #2205632)
#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;
}