Pagini recente » Cod sursa (job #2548850) | Cod sursa (job #2630515) | Cod sursa (job #1823104) | Cod sursa (job #2507488) | Cod sursa (job #2940368)
#pragma GCC optimize("O3")
#pragma GCC optimize("Ofast")
#pragma GCC optimize ("unroll-loops")
#include <fstream>
#include <bits/stdc++.h>
using namespace std;
ifstream f("apm.in");
ofstream g("apm.out");
#define MAXN 100001
#define infinite 1e9
struct hashFunction
{
size_t operator()(const pair<int ,
int> &x) const
{
return x.first ^ x.second;
}
};
int main()
{
int n,m,cost,x,y;
f>>n>>m;
vector<vector<pair<int,int>>>lista;
for(int i = 0;i<n+1;i++)
lista.push_back({});
for(int i = 0;i<m;i++)
{
f>>x>>y>>cost;
lista[x].push_back({y, cost});
lista[y].push_back({x,cost});
}
vector<int> distante(n+1,infinite);
priority_queue<pair<int,int>,vector<pair<int,int>>,greater<pair<int,int>>> pq;
int nrMuchii = 0;
pq.push({0,1});
vector<bool> inArbore(n+1,false);
inArbore[1] = true;
int costTotal = 0;
vector<pair<int,int>> muchii;
unordered_set<pair<int, int>,
hashFunction> muchiiHash;
distante[1] =0;
vector<int>tata(n+1,0);
int nodCurent;
while (!pq.empty())
{
nodCurent = pq.top().second;
int costNodCurent = pq.top().first;
pq.pop();
for(int j = 0;j<lista[nodCurent].size();j++)
if(inArbore[lista[nodCurent][j].first] == false && distante[lista[nodCurent][j].first]>lista[nodCurent][j].second)
{
distante[lista[nodCurent][j].first] = lista[nodCurent][j].second;
tata[lista[nodCurent][j].first] = nodCurent;
pq.push({ distante[lista[nodCurent][j].first],lista[nodCurent][j].first});
}
inArbore[nodCurent] = true;
if(nodCurent!= 1) {
int ok = 1;
// for(auto muchie:muchii)
// if(muchie.first == nodCurent && muchie.second == tata[nodCurent])
// ok = 0;
// if(ok == 1) {
// nrMuchii++;
// muchii.push_back({nodCurent, tata[nodCurent]});
// }
if(muchiiHash.find({nodCurent,tata[nodCurent]}) == muchiiHash.end())
{
nrMuchii++;
muchii.push_back({nodCurent, tata[nodCurent]});
muchiiHash.insert({nodCurent, tata[nodCurent]});
}
}
}
for(int i = 1;i<distante.size();i++)
costTotal += distante[i];
g<<costTotal<<endl;
g<<nrMuchii<<endl;
for(auto muchie:muchii)
g<<muchie.first<<' '<<muchie.second<<endl;
f.close();g.close();
}