Pagini recente » Cod sursa (job #3033522) | Cod sursa (job #2121624) | Cod sursa (job #1885270) | Cod sursa (job #1329551) | Cod sursa (job #1590291)
#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;
}