Cod sursa(job #2948886)

Utilizator vlad_dimuVlad Dimulescu vlad_dimu Data 28 noiembrie 2022 18:20:47
Problema A+B Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.87 kb
#include <fstream>
#include <vector>
#include <algorithm>
#define MAXN 31200
using namespace std;

ifstream fin( "ninjago.in" );
ofstream fout( "ninjago.out" );

struct Node{
    int vecin, cost, e;
};

struct Muchie{
    int x, y, cost, e;
}muchii[MAXN];
int nMuchii;

bool cmp( Muchie a, Muchie b ){
    if( a.e == b.e )
        return a.cost < b.cost;
    return a.e < b.e;
}

vector <Node> graph[MAXN];
int marked[MAXN];

void dfs( int node, int comp ){
    int vecin, i;
    marked[node] = comp;
    for( i = 0; i < graph[node].size(); i++ ){
        vecin = graph[node][i].vecin;
        if( graph[node][i].e == 0 && marked[vecin] == 0 )
            dfs( vecin, comp );
    }
}

int find( int i ) {
  if ( marked[i] == i + 1 )   // daca am gasit seful suprem
    return i + 1;          // il returnam
  return marked[i] = find( marked[i] - 1); // altfel legam i la seful suprem, pe care il si returnam
}

void unionn( int i, int j ) {
  int sefi, sefj;

  sefi = find( i ); // seful suprem al lui i
  sefj = find( j ); // seful suprem al lui j

  marked[sefj] = sefi; // seful suprem al lui sefj devine sefi
}

int main(){
    int T, n, m, i, j, cost, x, y, pow, e, sol, comp, alese, sumcost, sumE;
    char ch;
    fin >> T >> n >> m;
    for( i = 0; i < m; i++ ){
        fin >> x >> y;
        cost = 0;
        e = 0;
        pow = 1;
        for( j = 0; j < 4; j++ ){
            fin >> ch;
            if( ch == 'E' )
                e++;
            else
                cost += (ch - 'A' + 1) * pow;
            pow *= 5;
        }
        x--, y--;
        graph[x].push_back( {y, cost, e} );
        graph[y].push_back( {x, cost, e} );
        if( e != 0 ){
            muchii[nMuchii].x = x;
            muchii[nMuchii].y = y;
            muchii[nMuchii].cost = cost;
            muchii[nMuchii].e = e;
            nMuchii++;
        }
    }

    if( T == 1 ){
        dfs( 0, 1 );
        sol = 0;
        for( i = 0; i < n; i++ )
            if( marked[i] == 1 )
                sol++;
        fout << sol;
    }
    else{
        //componente conexe
        comp = 0;
        for( i = 0; i < n; i++ ){
            if( marked[i] == 0 ){
                comp++;
                dfs( i, i + 1 );
            }
        }

        sort( muchii, muchii + nMuchii, cmp );

        alese = 0;
        sumcost = 0;
        sumE = 0;
        i = 0;

        while( alese < n - 1 ){
            if( marked[muchii[i].x] != marked[muchii[i].y] ){ //unim cele doua comp conexe
                sumE += muchii[i].e;
                sumcost += muchii[i].cost;
                unionn( muchii[i].x, muchii[i].y );
                alese++;
            }
            i++;
        }

        if( T == 2 )
            fout << comp - 1 << '\n' << sumE;
        else
            fout << sumcost;
    }

    return 0;
}