Cod sursa(job #2558323)

Utilizator danbesuDan Besu danbesu Data 26 februarie 2020 14:50:04
Problema Arbore partial de cost minim Scor 20
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 3.22 kb
#include <iostream>
#include<fstream>
#include<vector>
#include<algorithm>
#define nmax 200001
#define mmax 400001

using namespace std;

ifstream in("apm.in");
ofstream out("apm.out");

struct ab{
    int a, b, c;
    bool vizz = false;
};

struct gr{
    int nod, indice;
};

int n, m, cost_min = 0, nr_muchii = 0;
vector<gr> graf[nmax];
vector<ab>muchii;
vector<int>viz;

bool cmp(ab x, ab y){
    return (x.c < y.c);
}

bool verif_ciclu_dfs(int v, int u, int capat){
    //cout<<"dfs(" << v <<' '<<u<<' '<<capat<<')'<<'\n';
    vector<bool>rez;
    bool am_muchii_vizitate = false;
    for(int i = 0; i < graf[v].size(); ++i){
        int vecin = graf[v][i].nod;

        if(vecin != u){
            int indicele_muchiei = graf[v][i].indice;
            if( muchii[indicele_muchiei].vizz == true ){
                if(vecin == capat){
                    //cout<<"capat true"<<'\n';
                    return true;
                }
            }
        }
    }

    for(int i = 0; i < graf[v].size(); ++i){
        int vecin = graf[v][i].nod;
         //cout<<"vecin: "<<vecin<<'\n';
        if(vecin != u){

            int indicele_muchiei = graf[v][i].indice;
            //cout<<"indice: "<<indicele_muchiei<<'\n';
            if( muchii[indicele_muchiei].vizz == true ){
                am_muchii_vizitate = true;
                //cout<< "dfs("<<vecin<<' '<<v<<' '<<capat<<')'<<'\n';
                rez.push_back( verif_ciclu_dfs(vecin, v, capat) );
            }
        }
    }
    if(am_muchii_vizitate){
        bool ok = false;
        //cout<<"am_muchii vizitate: ";
        for(int i = 0; i < rez.size(); ++i){
            //cout<<rez[i]<<' ';
            if(rez[i] == 1)
                return true;
        }
        //cout<<'\n';
        //cout<<ok<<'\n';
        return false;
    }
    else {  //cout<<"fals" << '\n';
            return 0;
    }
}
int main()
{
    in>>n>>m;
    for(int i = 0; i < m; ++i){
        ab x; in >> x.a >> x.b >> x.c;
        muchii.push_back(x);
    }

    sort(muchii.begin(), muchii.end(), cmp);

    for(int i = 0; i < m; ++i){
        gr x;
        x.nod = muchii[i].b; x.indice = i;
        graf[ muchii[i].a ].push_back(x);
        x.nod = muchii[i].a;
        graf[ muchii[i].b ].push_back(x);
    }

    for(int i = 0; i < m; ++i){
        int cost = muchii[i].c; int u = muchii[i].a; int v = muchii[i].b;
        //if(viz.size() < n){
            if(verif_ciclu_dfs(v, u, u) == false){
                ++nr_muchii;
                cost_min += cost;
                viz.push_back(u);
                viz.push_back(v);
                muchii[i].vizz = true;
            }
        //}
        //else break;
    }
    out<<cost_min<<'\n'<<nr_muchii<<'\n';
    for(int i = 0; i < m; ++i){
        if(muchii[i].vizz == true)
            out<<muchii[i].a<<' '<<muchii[i].b<<'\n';
    }

    return 0;
}

/*
for(int i = 1; i <= n; ++i){
        cout<<i<<'-';
        for(int j = 0; j < graf[i].size(); ++j){
            cout<<graf[i][j]<<' ';
        }
        cout<<'\n';
    }
    cout<<'\n';
    for(int i = 0; i < m; ++i){
        cout<<muchii[i].a<<' '<<muchii[i].b<<' '<<muchii[i].cost << '\n';
    }
*/