Cod sursa(job #2565356)

Utilizator NashikAndrei Feodorov Nashik Data 2 martie 2020 13:50:40
Problema Arbore partial de cost minim Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 3.32 kb
//#include <iostream>
#include <fstream>
#include <deque>
#include <vector>
#include <unordered_set>
#include <algorithm>

using namespace std;

ifstream cin("autobuze3.in");
ofstream cout("autobuze3.out");

unordered_set <int> um;
deque<int> topo;
int tata[200005],sz[200005],szz[200005],autobuz[200005],n,m,legitinv[200005];
long long cost;
int f[200005];
vector<int> graf[200005],legit[200005];
vector<pair<int,int> > v[200005];
pair<int,pair<int,int> > edge[400005];

int daddy(int a){
    if(tata[a]==a){
        return a;
    }
    tata[a]=daddy(tata[a]);
    return tata[a];
}
void unite(int a,int b,int c){
    if(daddy(a)!=daddy(b)){
        if(sz[tata[a]]>sz[tata[b]]){
            tata[tata[b]]=tata[a];
            sz[tata[a]]+=sz[tata[b]];
        }
        else{
            tata[tata[a]]=tata[b];
            sz[tata[b]]+=sz[tata[a]];
        }
        cost+=c;
        graf[a].push_back(b);
        graf[b].push_back(a);
    }
}
void dfs(int nod){
    um.insert(nod);
    for(auto u:graf[nod]){
        if(um.find(u)==um.end()){
            dfs(u);
            legit[nod].push_back(u);
            f[nod]++;
        }
    }
}
void calc_size(int nod){
    szz[nod]=1;
    for(auto u:legit[nod]){
        calc_size(u);
        szz[nod]+=szz[u];
    }
}
void find_fii(int nod,int a1,int a2){
    cout<<"Move "<<nod<<" "<<a1<<" "<<a2<<"\n";
    for(auto u:legit[nod]){
        find_fii(u,a1,a2);
    }
}
void AFIS_MOVE(int a1,int a2){
    find_fii(a1,autobuz[a1],autobuz[a2]);
}
void MOVE(int nod){
    int maxi=-1,k;
    for(auto u:legit[nod]){
        cout<<"Drive "<<autobuz[u]<<" "<<u<<" "<<nod<<"\n";
        if(szz[u]>maxi){
            maxi=szz[u];
            k=u;
        }
    }
    if(maxi==-1){

        return;
    }
    //AFIS_MOVE(nod,autobuz[k]);
    cout<<"Move "<<nod<<" "<<nod<<" "<<autobuz[k]<<"\n";
    for(auto u:legit[nod]){
        if(k==u){
            continue;
        }
        AFIS_MOVE(u,k);
    }
    autobuz[nod]=autobuz[k];
}
int main()
{
    int t,a,b,c;
    cin>>t;
    while(t--){
        cin>>n>>m;
        cost=0;
        um.clear();
        for(int i=1;i<=n;i++){
            autobuz[i]=i;
            tata[i]=i;
            sz[i]=1;
            v[i].resize(0);
            legit[i].resize(0);
            graf[i].resize(0);
            legitinv[i]=0;
            f[i]=0;
            szz[i]=0;
        }
        for(int i=1;i<=m;i++){
            cin>>a>>b>>c;
            v[a].push_back(make_pair(b,c));
            edge[i]=make_pair(c,make_pair(a,b));
        }
        sort(edge+1,edge+m+1);
        for(int i=1;i<=m;i++){
            unite(edge[i].second.first,edge[i].second.second,edge[i].first);
        }
        cout<<cost<<"\n";
        int root=1;
        dfs(root);
        for(int i=1;i<=n;i++){
            if(f[i]==0){
                topo.push_front(i);
            }
        }
        for(int i=1;i<=n;i++){
            //cout<<i<<"->";
            for(auto u:legit[i]){
                //cout<<u<<" ";
                legitinv[u]=i;
            }
            //cout<<"\n";
        }
        calc_size(root);
        //cout<<"gigel\n";
        while(topo.empty()==false){
            int x=topo.front();
            topo.pop_front();
            MOVE(x);
            f[legitinv[x]]--;
            if(f[legitinv[x]]==0){
                topo.push_back(legitinv[x]);
            }
        }
        cout<<"Gata\n";
    }
    return 0;
}