Pagini recente » Cod sursa (job #2704578) | Cod sursa (job #406677) | Cod sursa (job #2201458) | Cod sursa (job #747056) | Cod sursa (job #1435254)
#include <fstream>
#include <vector>
#define pb push_back
#define mkp make_pair
using namespace std;
ifstream in ("apm.in");
ofstream out("apm.out");
int const N=200005;
int const INF=1005;
int VEC[N],ANS,V[N];
vector <pair<int,int> > VECT[N],VANS;
int n,m,C[N];
struct heap
{
int L;
int H[N * 2 + 100],POZ[N];
void push(int poz)
{
while((poz * 2 <= L && V[H[poz]] > V[H[poz * 2]]) || (poz * 2 + 1 <= L && V[H[poz]] > V[H[poz * 2 + 1]]))
{
if (V[H[poz * 2]] < V[H[poz * 2 + 1]] || poz * 2 + 1 > L)
{
swap(H[poz],H[poz * 2]);
swap(POZ[H[poz]],POZ[H[poz * 2]]);
poz *= 2;
}
else
{
swap(H[poz],H[poz * 2 + 1]);
swap(POZ[H[poz]],POZ[H[poz * 2 + 1]]);
poz = poz * 2 + 1;
}
}
}
void pop(int poz)
{
while(poz > 1 && V[H[poz]] < V[H[poz / 2]])
{
swap(H[poz],H[poz / 2]);
swap(POZ[H[poz]],POZ[H[poz / 2]]);
poz = poz / 2;
}
}
void introduce_in_heap(int nod)
{
H[++L] = nod;
POZ[nod] = L;
pop(L);
}
int scoate_radacina_heap()
{
int x = H[1];
swap(H[1],H[L]);
swap(POZ[H[1]],POZ[H[L]]);
L--;
push(1);
POZ[x] = 0;
return x;
}
}h;
void introduce_in_apm(int x)
{
for(unsigned int i = 0;i < VECT[x].size(); ++i)
{
int nod = VECT[x][i].first;
int cost = VECT[x][i].second;
V[nod] = min(V[nod],cost);
if (V[nod] == cost) VEC[nod] = x;
}
}
int main()
{
in>>n>>m;
for(int i = 1;i <= m; ++i)
{
int x,y,c;
in>>x>>y>>c;
VECT[x].pb(mkp(y,c));
VECT[y].pb(mkp(x,c));
}
for(int i = 1;i <= n; ++i) V[i] = INF;
V[1] = 0;
introduce_in_apm(1);
for(int i = 2;i <= n; ++i)
{
h.introduce_in_heap(i);
}
for(int i = 1;i < n; ++i)
{
int x = h.scoate_radacina_heap();
introduce_in_apm(x);
ANS += V[x];
VANS.pb(mkp(x,VEC[x]));
for(unsigned int j = 0;j < VECT[x].size(); ++j)
{
int nod = VECT[x][j].first;
if (h.POZ[nod]) h.pop(h.POZ[nod]);
}
}
out<<ANS<<"\n"<<n-1<<"\n";
for(unsigned int i = 0;i < n - 1; ++i)
out<<VANS[i].first<<" "<<VANS[i].second<<"\n";
return 0;
}