Pagini recente » Cod sursa (job #2592898) | Cod sursa (job #2079642) | Cod sursa (job #53224) | Cod sursa (job #597712) | Cod sursa (job #229340)
Cod sursa(job #229340)
#include<stdio.h>
#include<vector>
#include<algorithm>
#include<cassert>
#define pb push_back
#define mkp make_pair
using namespace std;
const int maxn = 400000;
int N,M;
int VER[maxn],NR;
int ANS,NOD;
vector<int> VECT[maxn],VECT1[maxn];
vector<pair<int,pair<int,int> > > VECTMU;
void dfs(int nod)
{
if (VER[nod])return;
VER[nod] = 1;
--NR;
for(unsigned int i = 0;i < VECT[nod].size(); ++i)
dfs(VECT[nod][i]);
}
void dfs2(int nod)
{
if (VER[nod])return;
VER[nod] = 1;
for(unsigned int i = 0;i < VECT1[nod].size();++i) dfs2(VECT1[nod][i]);
}
int main()
{
freopen("grader_test5.in","r",stdin);
freopen("grader_test5.out","w",stdout);
scanf("%d %d\n",&N,&M);
assert(1 <= N && N <= 200000);
assert(1 <= M && M <= 400000);
for(int i = 1;i <= M; ++i)
{
int x,y,c;
scanf("%d %d %d",&x,&y,&c);
VECT[x].pb(y);
VECT[y].pb(x);
VECTMU.pb(mkp(c,mkp(x,y)));
}
NR = N;
dfs(1);
assert(NR == 0);
sort(VECTMU.begin(),VECTMU.end());
NR = N;
for(int i = 0;i < M; ++i)
{
int cost = VECTMU[i].first;
int nod1 = VECTMU[i].second.first;
NOD = VECTMU[i].second.second;
memset(VER,0,sizeof(VER));
dfs2(nod1);
if (!VER[NOD]) {--NR;VECT1[nod1].pb(NOD);VECT1[NOD].pb(nod1);ANS += cost;}
if (NR == 1) break;
}
printf("%d\n",ANS);
return 0;
}