Cod sursa(job #1297484)

Utilizator Vele_GeorgeVele George Vele_George Data 22 decembrie 2014 00:11:18
Problema Paduri de multimi disjuncte Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.13 kb
#include <iostream>
#include <fstream>
#include <queue>
#include <vector>
using namespace std;
ifstream f("disjoint.in");
ofstream go("disjoint.out");

vector< queue<int> > g;
vector< int > v;
int n,m,act,x,y;

void join(int x, int y){
    /*cerr << " ";
    for(int i=1; i<=n; i++)
        cerr << v[i] << " ";
        cerr << "\n";
*/
    int hi,lo,aux;
    if(g[v[x]].size()>g[v[y]].size()){
        hi=v[x];
        lo=v[y];
    }else{
        hi=v[y];
        lo=v[x];
    }
    while(!g[lo].empty()){

        aux=g[lo].front();
        v[aux]=hi;
        g[hi].push(aux);
        g[lo].pop();
    }
 /*   cerr <<" ";
    for(int i=1; i<=n; i++)
        cerr << v[i] << " ";
        cerr << "\n";

*/
}


int main()
{
    f>>n>>m;
    g.resize(n+1);
    for(int i=0; i<=n; i++){
        v.push_back(i);
        g[i].push(i);
    }

    for(int i=1; i<=m; i++){

        f>>act>>x>>y;
      //  cerr << act << " " << x <<" "<< y<< "\n";

        if (act==1) join(x,y);
        else if (v[x]==v[y]) go<<"DA\n";
        else go<<"NU\n";
    }


    f.close();
    go.close();
    return 0;
}