Cod sursa(job #2370393)

Utilizator andonis1616And Cuz andonis1616 Data 6 martie 2019 11:55:47
Problema Arbore partial de cost minim Scor 20
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.99 kb
#include <fstream>
#include <vector>
#include <queue>
#define NMAX 105
#define inf NMAX*NMAX*1005
using namespace std;
ifstream in ("apm.in");
ofstream out ("apm.out");

struct costuri{
int cost,muchie;
};

struct prim{
int m1,m2,cost;

/*bool operator < (const prim &other) const{

    return cost>other.cost;
}*/
};

class cmp{

public:
    bool operator () (const prim &a, const prim &b) const{

        return a.cost>b.cost;
    }
};

int n,m,tata[NMAX],l,c,s;
bool vizitat[NMAX];

vector <costuri> muchii[NMAX];
priority_queue <prim, vector <prim>, cmp> heap;

void transfer(int x)
{
    costuri nod_curent;
    prim aux;
    for(auto i=muchii[x].begin();i!=muchii[x].end();i++){
        nod_curent=*i;
        aux.m1=x;
        aux.m2=nod_curent.muchie;
        aux.cost=nod_curent.cost;
        heap.push(aux);
    }
}

int main()
{
    bool okay;
    costuri nod_curent;
    prim aux;
    int i,k,x,y,c;
    in>>n>>m;
    for(i=1;i<=m;i++){
        in>>x>>y>>c;
        nod_curent.cost=c;
        nod_curent.muchie=y;
        muchii[x].push_back(nod_curent);
        nod_curent.muchie=x;
        muchii[y].push_back(nod_curent);
    }
    vizitat[1]=1;
    tata[1]=0;
    transfer(1);
    for(k=1;k<=n-1;k++){
        okay=true;
        while(!heap.empty() and okay==true){
            aux=heap.top();
            heap.pop();
            if(vizitat[aux.m1]+vizitat[aux.m2]==1){
                okay=false;
                s+=aux.cost;
                if(vizitat[aux.m1]==1){
                    vizitat[aux.m2]=1;
                    tata[aux.m2]=aux.m1;
                    transfer(aux.m2);
                }
                else{
                    vizitat[aux.m1]=1;
                    tata[aux.m1]=aux.m2;
                    transfer(aux.m1);
                }
            }
        }
    }
    out<<s<<'\n'<<n-1<<'\n';
    for(i=1;i<=n;i++){
        if(tata[i]!=0)
            out<<tata[i]<<' '<<i<<'\n';
    }
    return 0;
}