Pagini recente » Cod sursa (job #193843) | Cod sursa (job #1433757) | Cod sursa (job #1296805) | Cod sursa (job #584979) | Cod sursa (job #1042974)
#include <cstdio>
#include <vector>
#include <set>
#define INF 2000000
#define pb push_back
#define Nr 200001
using namespace std;
int i, N, M, Total=0, D[Nr], U[Nr], T[Nr];
vector < pair < int, int > > G[Nr], Sol;
set < pair< int, int > > H;
inline void read()
{
int i, x, y, cost;
scanf("%d%d", &N, &M);
for (i=1; i<=M; i++)
{
scanf("%d%d%d", &x, &y, &cost);
G[x].pb( make_pair(cost, y) );
G[y].pb( make_pair(cost, x) );
}
}
inline void solve()
{
int i,nod,cost;
vector <pair<int, int> >::iterator it;
for (i=2; i<=N; i++) D[i]=INF;
H.insert ( make_pair (0, 1));
while ( H.size()>0)
{
nod=(*H.begin()).second;
cost=(*H.begin()).first;
H.erase( *H.begin());
if (U[nod]) continue;
U[nod]=1;
Total+=cost;
Sol.pb(make_pair(nod, T[nod]));
for (it=G[nod].begin(); it!=G[nod].end(); it++)
if (!U[(*it).second] && D[(*it).second]> (*it).first)
D[(*it).second]=(*it).first, T[(*it).second]=nod, H.insert( make_pair(D[(*it).second], (*it).second));
}
}
int main()
{
freopen("apm.in", "r", stdin);
freopen("apm.out", "w", stdout);
read();
solve();
printf("%d\n", Total);
printf("%d\n", N-1);
for (i=1; i<Sol.size(); i++)
printf("%d %d\n", Sol[i].first, Sol[i].second);
return 0;
}