Cod sursa(job #3196120)

Utilizator Cazacu2006RazvanRazvan Cazacu Cazacu2006Razvan Data 22 ianuarie 2024 20:20:51
Problema Evaluarea unei expresii Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.35 kb
#include <fstream>
#include <vector>
#include <algorithm>
#include <cstring>
using namespace std;
ifstream fin("autobuze3.in");
ofstream fout("autobuze3.out");
int t,tata[300000],fr[300000],p[300001],radacina;
struct numar
{
    int x,y,c;
};
vector <numar> q;
vector <int> A[300005];
int cmp(numar a,numar b)
{
    return a.c<b.c;
}
int rad(int x)
{
    while(tata[x]>0)
        x=tata[x];
    return x;

}
void join(int x,int y)
{

    if(tata[x]>tata[y]){

        swap(x,y);
    }
    radacina=x;


    tata[x]+=tata[y];
    tata[y]=x;
}

void rez()
{
    int n,m;
    radacina=0;
    q.clear();
    fin>>n>>m;
    memset(fr,0,sizeof(fr));
    for(int i=1;i<=n;i++){
        A[i].clear();

    }
    for(int i=1;i<=n;i++)
        tata[i]=-1;
    for(int i=1;i<=m;i++)
    {
        int x,y,z;
        fin>>x>>y>>z;
        q.push_back({x,y,z});
    }
    sort(q.begin(),q.end(),cmp);
    int k=0;
    long long cost=0;
    for(int i=0;k<n-1;i++)
    {
        int x=q[i].x;
        int y=q[i].y;
        int c=q[i].c;
        int xr=rad(x);
        int yr=rad(y);
        if(xr!=yr)
        {
            k++;
            join(xr,yr);
            A[x].push_back(y);
            A[y].push_back(x);
            cost=cost+c;
        }
    }
    fout<<cost<<"\n";
    for(int i=1;i<=n;i++)
    {
        if(A[i].size()==1 && fr[i]==0)
        {


            int x=i;
             fr[i]=1;
            int nr=0;
            int ok=1;
            int tata=0;
            while(ok)
            {
                int kr=0;
                ok=0;
                for(auto pr:A[x])
                {
                    if(pr!=tata)
                    {
                        ok=1;
                        kr=pr;
                    }
                }
                if(ok==0 || x==radacina)
                    break;
                p[++nr]=x;
                fout<<"Drive"<<" "<<x<<" "<<x<<" "<<kr<<"\n";
                for(int r=1;r<=nr;r++)
                {
                    fout<<"Move"<<" "<<p[r]<<" "<<x<<" "<<kr<<"\n";

                }

                fr[kr]=1;
                tata=x;
                x=kr;
            }

        }
    }

    fout<<"Gata"<<"\n";
}
int main()
{
    fin>>t;
    for(int i=1;i<=t;i++)
    {
        rez();
    }

    return 0;
}