Cod sursa(job #1704795)

Utilizator GreeDGlavan George Florian GreeD Data 19 mai 2016 12:22:25
Problema Arbore partial de cost minim Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 2.65 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <algorithm>

using namespace std;



vector<pair<int,int> > muchie[201];
int viz[201];
vector<pair<int,pair<int,int> > >h;
vector<pair<int,int> > sol;

int main()
{
    ifstream f("online.in");
    ofstream g("online.out");

    int n,m,x,y,cost,k;

    f>>n>>m;

    for(int i=0;i<m;i++){
        f>>x>>y>>cost;
        muchie[x].push_back(make_pair(y,cost));
        muchie[y].push_back(make_pair(x,cost));
    }
    viz[1]=1;

    for(vector<pair<int,int> >::iterator i=muchie[1].begin();i<muchie[1].end();++i){
        h.push_back(make_pair(1000-(*i).second,make_pair(1,(*i).first)));
    }

    make_heap(h.begin(),h.end());

    int cT=0;

    int j;
    for(j=0;j<n-1;){
        int c;
        pair<int,pair<int,int> > th;
        th=h.front();
        pop_heap (h.begin(),h.end());
        h.pop_back();

        c=1000-th.first;
        if(viz[th.second.second]==0){

            viz[th.second.second]=1;
            cT+=c;

            for(vector<pair<int,int> >::iterator i=muchie[th.second.second].begin();i<muchie[th.second.second].end();++i){
                if(viz[(*i).first]==0){
                    h.push_back(make_pair(1000-(*i).second,make_pair(th.second.second,(*i).first)));
                    push_heap(h.begin(),h.end());
                }
            }
            j++;
        }

    }

    g<<cT<<'\n';

    f>>k;
    for(int i=0;i<k;i++){
        for(int i=0;i<201;i++) viz[i]=0;
        h.erase(h.begin(),h.end());
        cT=0;
        f>>x>>y>>cost;
        muchie[x].push_back(make_pair(y,cost));
        muchie[y].push_back(make_pair(x,cost));

        viz[1]=1;

        for(vector<pair<int,int> >::iterator i=muchie[1].begin();i<muchie[1].end();++i){
            h.push_back(make_pair(1000-(*i).second,make_pair(1,(*i).first)));
        }

        make_heap(h.begin(),h.end());

        int j;
    for(j=0;j<n-1;){
        int c;
        pair<int,pair<int,int> > th;
        th=h.front();
        pop_heap (h.begin(),h.end());
        h.pop_back();

        c=1000-th.first;
        if(viz[th.second.second]==0){

            viz[th.second.second]=1;
            cT+=c;

            for(vector<pair<int,int> >::iterator i=muchie[th.second.second].begin();i<muchie[th.second.second].end();++i){
                if(viz[(*i).first]==0){
                    h.push_back(make_pair(1000-(*i).second,make_pair(th.second.second,(*i).first)));
                    push_heap(h.begin(),h.end());
                }
            }
            j++;
        }

    }

    g<<cT<<'\n';


    }

    return 0;
}