Pagini recente » Istoria paginii runda/ionut | Cod sursa (job #451613) | Cod sursa (job #24184) | Cod sursa (job #2421330) | Cod sursa (job #2423080)
#include <iostream>
#include <fstream>
#include <vector>
#include <queue>
#include <tuple>
using namespace std;
vector <pair<int,int> > graf[200005];
vector <pair<int,int> > muchii;
priority_queue <tuple<int,int,int> > coada;
int viz[200005];
int Prim(int N)
{
viz[1]=1;
int i,lim,cost=0,x,y,c;
tuple<int,int,int> tuplu;
lim=graf[1].size();
for(i=0;i<lim;i++)
coada.push(make_tuple(-graf[1][i].second,1,graf[1][i].first));
while(coada.empty()==0)
{
tuplu=coada.top();
coada.pop();
c=-get<0>(tuplu);
x=get<1>(tuplu);
y=get<2>(tuplu);
if(viz[x]==1 && viz[y]==1)
continue;
if(viz[x]==1 && viz[y]==0)
{
muchii.push_back(make_pair(x,y));
cost+=c;
viz[y]=1;
lim=graf[y].size();
for(i=0;i<lim;i++)
{
coada.push(make_tuple(-graf[y][i].second,y,graf[y][i].first));
}
}
if(viz[y]==1 && viz[x]==0)
{
muchii.push_back(make_pair(x,y));
cost+=c;
viz[x]=1;
lim=graf[x].size();
for(i=0;i<lim;i++)
{
coada.push(make_tuple(-graf[x][i].second,x,graf[x][i].first));
}
}
}
return cost;
}
int main()
{
ifstream in("apm.in");
ofstream out("apm.out");
int N,M,x,y,c,i,cost;
in>>N>>M;
for(i=1;i<=M;i++)
{
in>>x>>y>>c;
graf[x].push_back(make_pair(y,c));
graf[y].push_back(make_pair(x,c));
}
cost=Prim(N);
out<<cost<<endl;
int lim=muchii.size();
out<<lim<<endl;
for(i=0;i<lim;i++)
out<<muchii[i].first<<" "<<muchii[i].second<<endl;
return 0;
}