Pagini recente » Cod sursa (job #2368752) | Cod sursa (job #1343510) | Cod sursa (job #598698) | Cod sursa (job #24760) | Cod sursa (job #3337375)
#include <iostream>
#include <queue>
#include <vector>
#include <fstream>
using namespace std;
ifstream f("apm.in");
ofstream g("apm.out");
const int INF=999999999;
int n,m,x,y,z,COST,D[200010],T[200010];
bool viz[200010];
vector<pair<int,int>>Fin;
struct muc {
int y,cos;
bool operator <(const muc &a)const {
return cos>a.cos;
}
};
vector<muc>G[200010];
priority_queue<muc>Q;
void prim() {
for(int i=2; i<=n; i++) {
D[i]=INF;
}
Q.push({1,0});
while(!Q.empty()) {
auto nod=Q.top();
Q.pop();
if(viz[nod.y]) {
continue;
}
viz[nod.y]=1;
COST+=D[nod.y];
if(T[nod.y]) {
Fin.push_back({nod.y,T[nod.y]});
}
for(const auto&m:G[nod.y]) {
if(!viz[m.y]&&m.cos<D[m.y]) {
D[m.y]=m.cos;
T[m.y]=nod.y;
Q.push(m);
}
}
}
}
int main() {
f>>n>>m;
for(int i=1; i<=m; i++) {
f>>x>>y>>z;
G[x].push_back({y,z});
G[y].push_back({x,z});
}
prim();
g<<COST<<'\n'<<Fin.size()<<'\n';
for(const auto&[a,b]:Fin) {
g<<a<<' '<<b<<'\n';
}
f.close();
g.close();
return 0;
}