Pagini recente » Cod sursa (job #1875766) | Cod sursa (job #1804755) | Cod sursa (job #1222514) | Cod sursa (job #346311) | Cod sursa (job #288936)
Cod sursa(job #288936)
#include <cstdio>
#include <cstring>
#include <vector>
#include <queue>
#include <set>
using namespace std;
const int maxn = 200001;
#define mp make_pair
#define pb push_back
#define inf 0x3f3f3f3f
int d[maxn];
int kesz[maxn], p[maxn];
int n, m;
vector<pair<int, int> > g[maxn];
set<pair<int,int> > Q;
int tcost;
void read()
{
scanf("%d%d", &n, &m);
for (int i = 1; i <= m; ++i)
{
int x, y, c; scanf("%d%d%d", &x, &y, &c);
g[x].pb(mp(y,c));
g[y].pb(mp(x,c));
}
}
void prim()
{
memset(d, 0x3f, sizeof(d));
//memset(kesz, 0, sizeof(kesz));
//for (int i = 1; i <= n; ++i) Q.insert(i);
Q.insert(make_pair(0, 1));
d[1] = 0;
int t = n;
while (Q.size() && t)
{
int akt = (*Q.begin()).second;
Q.erase(Q.begin());
if(kesz[akt]) continue;
--t;
tcost += d[akt];
kesz[akt] = 1;
for (int i = 0; i < g[akt].size(); ++i)
{
int next = g[akt][i].first; int cost = g[akt][i].second;
if (kesz[next]) continue;
if (d[next] > cost)
{
d[next] = cost;
p[next] = akt;
Q.insert(make_pair(d[next], next));
}
}
}
}
int main()
{
freopen("apm.in","r",stdin);
freopen("apm.out","w",stdout);
read();
prim();
printf("%d\n", tcost);
printf("%d\n", n - 1);
for (int i = 2; i <= n; ++i)
printf("%d %d\n", p[i], i);
return 0;
}