Pagini recente » Cod sursa (job #190119) | Cod sursa (job #1366886) | Cod sursa (job #1106360) | Cod sursa (job #1976808) | Cod sursa (job #2948886)
#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;
}