Pagini recente » Cod sursa (job #2692705) | Clasamentul arhivei educationale | Cod sursa (job #2086436) | Cod sursa (job #323793) | Cod sursa (job #2985138)
#include <iostream>
#include <vector>
#include <fstream>
using namespace std;
ifstream fin("apm.in");
ofstream fout("apm.out");
const int NMAX=100001;
vector <int> G[NMAX];
struct muchie{
int m1,m2,cost;
}; muchie mu[40000];
int N,M,a[100][100],viz[100],tata[100],c[100],m[100],k, v[100],cmin;
void citire()
{
int X,Y,C;
fin>>N>>M;
for(int i=1;i<=M;i++)
{
fin>>X>>Y>>C;
mu[i].m1=X;
mu[i].m2=Y;
mu[i].cost=C;
}
}
void schimb(muchie mu[], int x, int y)
{
int aux;
aux=mu[x].m1;
mu[x].m1=mu[y].m1;
mu[y].m1=aux;
aux=mu[x].m2;
mu[x].m2=mu[y].m2;
mu[y].m2=aux;
aux=mu[x].cost;
mu[x].cost=mu[y].cost;
mu[y].cost=aux;
}
void dfs(int x)
{
for(auto nbr: G[x])
if(v[nbr]!=1 )
{
v[nbr]=1;
dfs(nbr);
}
}
int vnod()
{
for(int i=1;i<=N;i++)
if(viz[i]!=1) return 0;
return 1;
}
void apm()
{
int i=1;
k=1;
while(vnod()!=1 ){
for(int i=1;i<=N;i++) v[i]=0;
dfs(mu[i].m1);
if(viz[mu[i].m1]!=1 || viz[mu[i].m2]!=1 || v[mu[i].m2]==0 )
{
G[mu[i].m1].push_back(mu[i].m2);
G[mu[i].m2].push_back(mu[i].m1);
viz[mu[i].m1]=1;
viz[mu[i].m2]=1;
m[k]=i;
k++;
cmin=cmin+mu[i].cost;
}
i++;
}
k--;
}
int main()
{
citire();
for(int i=1;i<=M;i++)
for(int j=i+1;j<=M;j++)
if(mu[i].cost>mu[j].cost)
schimb(mu,i,j);
apm();
cout<<cmin<<endl;
for(int i=1;i<=k;i++)
cout<<mu[m[i]].m1<<" "<<mu[m[i]].m2<<" "<<mu[m[i]].cost<<endl;
}