Cod sursa(job #2985138)

Utilizator iulia_mara81Dorhoi Iulia Mara iulia_mara81 Data 25 februarie 2023 18:49:24
Problema Arbore partial de cost minim Scor 0
Compilator cpp-32 Status done
Runda Arhiva educationala Marime 1.65 kb
#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;
}