Pagini recente » Cod sursa (job #1886388) | Cod sursa (job #2231113) | Cod sursa (job #187221) | Cod sursa (job #2042082) | Cod sursa (job #1499506)
#define _CRT_SECURE_NO_DEPRECATE
#include <stdio.h>
#include <vector>
using namespace std;
int H[200250*2], c[200001], P[200001], N, cnt = 0, M, par[200001], cost = 0;
vector<pair<int,int>> No[200001],apm;
const int inf = (1 << 30);
void per(int k){
while (k / 2 && c[H[k]] < c[H[k / 2]]){
swap(H[k], H[k / 2]);
swap(P[H[k]], P[H[k / 2]]);;
k /= 2;
}
}
void sift(int poz)
{
while ((poz * 2 <= cnt && c[H[poz]] > c[H[poz * 2]]) || (poz * 2 + 1 <= cnt && c[H[poz]] > c[H[poz * 2 + 1]]))
{
if (c[H[poz * 2]] < c[H[poz * 2 + 1]] || poz * 2 + 1 > cnt)
{
swap(H[poz], H[poz * 2]);
swap(P[H[poz]], P[H[poz * 2]]);
poz *= 2;
}
else
{
swap(H[poz], H[poz * 2 + 1]);
swap(P[H[poz]], P[H[poz * 2 + 1]]);
poz = poz * 2 + 1;
}
}
}
void add(int x){
H[++cnt] = x;
P[x] = cnt;
per(cnt);
}
void addapm(int x){
int co,k=-99;
for (int i = 0; i < No[x].size(); ++i){
int ch = No[x][i].first;
co = No[x][i].second;
if (co < c[ch]){
k = No[x][i].first; c[ch] = co;
}
if (c[ch] == co)par[No[x][i].first] = x;
}
if(k!=-99)add(k);
}
int rad(){
int x = H[1];
swap(H[1], H[cnt]);
swap(P[H[1]], P[H[cnt]]);
--cnt;
sift(1);
P[x] = 0;
return x;
}
int main(){
freopen("apm.in", "r", stdin);
freopen("apm.out", "w", stdout);
scanf("%d%d", &N, &M);
for (int i = 2; i <= N; ++i){
c[i] = inf;
}
c[1] = 0;
for (int i = 1; i <= M; ++i){
int a, b, d;
scanf("%d%d%d", &a, &b, &d);
No[a].push_back(make_pair(b, d));
No[b].push_back(make_pair(a, d));
}
addapm(1);
for (int i = 1; i < N; ++i){
int x = rad();
addapm(x);
cost += c[x];
apm.push_back(make_pair(x, par[x]));
for (int j = 0; j < No[x].size();++j)
if (P[No[x][j].first])per(P[No[x][j].first]);
}
printf("%d\n%d\n",cost-1,N-1);
for (int i = 0; i < N - 1; ++i)
printf("%d %d\n", apm[i].first, apm[i].second);
}