Đề bài:
Thuật toán:
- (đang cập nhập)
Code:
using namespace std;
#include
#define FOR(i, a, b) for (int i = a; i < b; i++)
#define FORE(i, a, b) for (int i = a; i <= b; i++)
#define FORD(i, a, b) for (int i = a; i >= b; i--)
const int MAXN = 5*1e6;
const int INF = 1e9 + 7;
typedef pair ii;
int p[MAXN], a[1001][1001];
vector < ii > adj[MAXN];
int n, maxa;
int get(int i, int j)
{
return (i - 1) * n + j;
}
int pa(int x)
{
while (p[x] > 0) x = p[x];
return x;
}
int Union(int r1, int r2)
{
int tmp = p[r1] + p[r2];
if (p[r1] < p[r2]){
p[r2] = r1;
p[r1] = tmp;
} else{
p[r1] = r2;
p[r2] = tmp;
}
return -tmp;
}
int main()
{
ios::sync_with_stdio(false); cin.tie(0);
// freopen("RSELECT.inp", "r", stdin);
// freopen("RSELECT.out", "w", stdout);
cin >> n;
FORE(i, 1, n) FORE(j, 1, n) {
cin >> a[i][j];
maxa = max(maxa, a[i][j]);
}
FORE(i, 1, n) FORE(j, 1, n){
int u = get(i, j);
if (i < n) adj[abs(a[i][j] - a[i + 1][j])].push_back(ii(u, get(i + 1, j)));
if (j < n) adj[abs(a[i][j] - a[i][j + 1])].push_back(ii(u, get(i, j + 1)));
}
memset(p, -1, sizeof(p));
int ans = 0;
FORE(ll, 0, maxa){
FOR(i, 0, adj[ll].size()) {
p[adj[ll][i].first] = -1;
p[adj[ll][i].second] = -1;
// cout<
Speak Your Mind