Cod sursa(job #1590291)

Utilizator metrix007Lungu Ioan Adrian metrix007 Data 4 februarie 2016 21:01:35
Problema Paduri de multimi disjuncte Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 2.2 kb
#include <iostream>
#include <fstream>
#include <vector>
#define NMAX 255*255
#define ST 255
using namespace std;

ifstream in("bile.in");
ofstream out("bile.out");

struct punct
{
    int x,y;

}p,r1,r2;

punct bile[NMAX],t[ST][ST];
int n,conex[ST][ST],Max,r[ST][ST];
vector<int> sol;
int dx[] ={1,-1,0,0};
int dy[] ={0,0,1,-1};

bool egal(punct a,punct b)
{
    if(a.x == b.x && a.y == b.y)
        return true;
    return false;
}

punct Find(punct a)
{
    punct r,aux;
    for(r=a;!egal(r,t[r.x][r.y]);r=t[r.x][r.y]);

    for(punct i=a;!egal(t[i.x][i.y],i);i = t[i.x][i.y])
    {
        aux = t[i.x][i.y];
         t[i.x][i.y] = r;
         i = aux;
    }

    if(t[r.x][r.y].x==0)
    {
        r.x = -1;
        r.y = -1;
    }
    return r;
}

void Union(punct r1,punct r2)
{
    if(r[r1.x][r1.y]>r[r2.x][r2.y])
    {
        t[r2.x][r2.y] = r1;
        conex[r1.x][r1.y] = conex[r1.x][r1.y] + conex[r2.x][r2.y];
        if(Max<conex[r1.x][r1.y])
                Max = conex[r1.x][r1.y];
    }
    else if(r[r1.x][r1.y]<r[r2.x][r2.y])
    {
        t[r1.x][r1.y] = r2;
        conex[r2.x][r2.y] = conex[r1.x][r1.y] + conex[r2.x][r2.y];
        if(Max<conex[r2.x][r2.y])
                Max = conex[r2.x][r2.y];
    }
    else
    {
        r[r2.x][r2.y]++;
        t[r1.x][r1.y] = r2;
        conex[r2.x][r2.y] = conex[r1.x][r1.y] + conex[r2.x][r2.y];
        if(Max<conex[r2.x][r2.y])
            Max = conex[r2.x][r2.y];
    }



}

int main()
{
    in >> n;
    for(int i=1;i<=n*n;i++)
        in >> bile[i].x >> bile[i].y;

    sol.push_back(0);

    for(int i=n*n;i>0;i--)
    {
        t[bile[i].x][bile[i].y] = bile[i];
        conex[bile[i].x][bile[i].y] = 1;

        for(int k=0;k<4;k++)
        {
         p.x = bile[i].x + dx[k];
         p.y = bile[i].y + dy[k];
         if(!(p.x >0 && p.y >0 && p.x<=n && p.y<=n))
                continue;
         r1 = Find(p);
         r2 = Find(bile[i]);

         if(!egal(r1,r2))
         {

             Union(r1,r2);
         }
        }
        sol.push_back(Max);
    }
    sol.pop_back();
    for(int i=sol.size()-1;i>=0;i--)
        out << sol[i] << "\n";
    return 0;
}