Cod sursa(job #2710247)

Utilizator paulm238Madaras Paul paulm238 Data 22 februarie 2021 11:37:08
Problema Arbori de intervale Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.58 kb
#include <iostream>
#include <fstream>
#include <cstring>
#include <algorithm>

using namespace std;
ifstream in("ninjago.in");
ofstream out("ninjago.out");

struct ind
{
    int a, b, mm, e;
} v[32000] = {0};


bool comp(ind & x, ind & y)
{
    if(x.mm != y.mm)
        return x.mm < y.mm;
    if(x.a != y.a)
        return x.a < y.a;
    if(x.b != y.b)
        return x.b <  y.b;
}

int q[32000] = {0};

void kruskal1(ind v[], int m, int n, int t, int q[])
{
    int c = 1, orr = 0, s = 0;
    int o = 0, k = 0;
    for(int i = 1; i <= m ; i ++)
    {
        if(q[v[i].a] != q[v[i].b])
        {
            s = s + v[i].mm;
            orr = 0;
            if(v[i].e != 0)
            {
                o ++;
                k = k + v[i].e;
                orr = 1;
                s = s - v[i].e * 1000;
            }
            int left = q[v[i].a];
            int right = q[v[i].b];
            if(right == 1)
            {
                int h = left;
                left = 1;
                right = h;
            }
            for(int j = 1; j <= n; j ++)
            {
                if(q[j] == right)
                {
                    if(left == 1 && orr != 1)
                    {
                        c ++;
                    }
                    q[j] = left;
                }
            }
        }

    }
    if(t == 1)
    {
        out << c;
    }
    else if( t == 2 )
    {
        out << o << '\n' << k;
    }
    else if(t == 3)
    {
        out << s;
    }
}


int main()
{
    int t, n, m, p;
    char ob[5];
    in >> t >> n >> m;
    for(int i = 1; i <= m; i ++)
    {
        in >> v[i].a >> v[i].b;
        q[v[i].a] = v[i].a;
        q[v[i].b] = v[i].b;
        in.get();
        in.get(ob, 5);
        for(int j = 0; j < strlen(ob); j ++ )
        {
            if(j == 0)
                p = 1;
            if(j == 1)
                p = 5;
            if(j == 2)
                p = 25;
            if(j == 3)
                p = 125;
            if(ob[j] == 'A')
                v[i].mm = v[i].mm + p * 1;
            if(ob[j] == 'B')
                v[i].mm = v[i].mm + p * 2;
            if(ob[j] == 'C')
                v[i].mm = v[i].mm + p * 3;
            if(ob[j] == 'D')
                v[i].mm = v[i].mm + p * 4;
            if(ob[j] == 'E')
            {
                v[i].mm = v[i].mm + 1000;
                v[i].e ++;
            }
        }
    }
    sort(v+1, v+1+m, comp);
    kruskal1(v, m, n, t, q);
    in.close();
    out.close();
    return 0;
}