Pagini recente » Cod sursa (job #1740878) | Cod sursa (job #2919405) | Cod sursa (job #2586636) | Cod sursa (job #938001) | Cod sursa (job #2205617)
#include <fstream>
#include <algorithm>
#include <set>
#include <vector>
#define infinit INT32_MAX
using namespace std;
struct muchie
{
int vi,vf;
double cost;
};
void afis(muchie m, ofstream &g)
{
g<<m.vi << " " <<m.vf<<" "<<m.cost<<endl;
}
double cost_total = 0;
void Prim(int s, int n, vector<pair<int,double>> *la, vector<muchie> &muchii_apcm, ofstream &g)
{
int u, *tata, *viz,i,v;
double *d,w_uv;
//*initializare d,tata,viz
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;
set <pair<double,int>> Q;
Q.insert({d[s],s});
for(i=1; i<=n-1; i++)
{
//varful nevizitat cu d minim
u=Q.begin()->second;
Q.erase(Q.begin());
viz[u]=1;
//actualizam etichetele vecinilor nevizitati
for(int j=0; j< (int)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;
Q.erase(make_pair(d[v],v)); //sterg perechea daca exista
d[v]=w_uv;
Q.insert(make_pair(d[v],v)); //adaug noua pereche v,d[v]
}
}
}
}
for(u=1; u<=n; u++)
if(tata[u]!=0) {
muchii_apcm.push_back({u,tata[u],d[u]});
cost_total += d[u];
}
}
int main()
{
fstream f("apm.in",ios::in);
ofstream g("apm.out");
int m,n,mc, x,y,i;
double c;
f>>n;
f>>m;
vector<pair <int,double> > *la;
la=new vector < pair <int,double> >[n+1];//graf- memorat cu liste de adiacenta
//citim muchiile
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 <muchie> muchii_apcm;
Prim(1,n,la,muchii_apcm,g);
g<<cost_total<<endl;
for(mc=0; mc< (int)muchii_apcm.size(); mc++)
{
afis(muchii_apcm[mc],g);
}
g.close();
return 0;
}