Pagini recente » Borderou de evaluare (job #3327280) | Borderou de evaluare (job #3304804) | Borderou de evaluare (job #3348100) | Borderou de evaluare (job #3333733) | Cod sursa (job #2425252)
#include <iostream>
#include <vector>
#include <set>
#include <fstream>
#include <limits.h>
using namespace std;
ifstream fin("apm.in");
ofstream fout("apm.out");
void prim(vector<vector<pair<int,int> > >&graf,int n)
{
vector<int> dist(n+1,INT_MAX);
vector<int> tata(n+1);
dist[1]=0;
tata[1]=0;
set<pair<int,pair<int,int> > >s;
for(auto muchie:graf[1])
{
s.insert({muchie.first,{1,muchie.second}});
}
int contor=0;
while(contor<n-1)
{
pair<int,pair<int,int> >pt=*(s.begin());
s.erase(s.begin());
if(dist[pt.second.second]==INT_MAX)
{
dist[pt.second.second]=pt.first;
tata[pt.second.second]=pt.second.first;
contor++;
for(auto muchie:graf[pt.second.second])
{
if(dist[muchie.second]==INT_MAX)
{
s.insert({muchie.first,{pt.second.second,muchie.second}});
}
}
}
}
int total=0;
for(int i=1;i<n+1;i++)
total+=dist[i];
fout<<total<<'\n';
fout<<n-1<<'\n';
for(int i=2;i<n+1;i++)
fout<<i<<' '<<tata[i]<<'\n';
}
int main()
{
int n,m;
fin>>n>>m;
vector<vector<pair<int,int> > >graf(n+1);
for(int i=0;i<m;i++)
{
int a,b,cost;
fin>>a>>b>>cost;
graf[a].push_back({cost,b});
graf[b].push_back({cost,a});
}
prim(graf,n);
return 0;
}