아무리 높은 산, 등산, 항상 올라,
도로가에 가서 오래있을 수에 도달 할 수있을 것입니다.
링크 포인트
제목 설명
M 행과 N 열은, 인접하는 포인트에 접속 될 수있는 도트 매트릭스가있다. 종 방향 연결은 횡 연결을 얻어 한 개의 단위 유닛을 걸린다. 이 몇 가지 포인트 사이의 연결은 이미, 또한 적어도이 모두 연결된 모든 지점을하는 데 걸리는 얼마나 많은 단위를 부탁드립니다.
기입
입력 개의 양의 정수의 첫 번째 라인은 m 및 n.
각각의 양의 정수의 X1, Y1, X2는 Y2가, Y2는 첫 번째 열의 두 번째 점 라인 (X1)의 2 배 Y1 컬럼 라인의 점을 나타내고 다음 네 줄의 일부 접속을 갖는다. X1-X2 | | + | Y1 입력되도록 -y2 | = 1이다.
수출
모든 통신 상기 출력 포인트 최소 비용을 요구하도록.
샘플 입력
2 2
1 1 2 1
샘플 출력
삼
힌트
30 %의 데이터 : N-m *의 <1,000 =
100 % 데이터 : m, N <= 1000
문제 분석 솔루션
먼저도 생각 동일한 단계의 설명과
심지어 최소 가격 때문에 먼저 수직는 수직에도 처음 두 지점이, 트리 아니다, 즉 루트가 동일하지 않은 경우 에 도시 된 바와 같이, 그 두 개의 링크를 넣어.
이 두 루트 것을 발견하는 경우, 화상에 나타낸 바와 같이, 좌우의 수직 아래 완료된 후가 연결되어 있지 않으면, 거기에 접속된다.
그러나이 그것을 수행하는 방법 이차원 분리 된 세트는, 실제로는 하나의 차원 사이에는 차이가 없습니다, 우리는 좋은의 좌표를 결정하기 위해 필요, 약간의 해시 의미 를.
그리하여이도 예를 들어 번호를 수있다
. 1 2 4 3 5
. 제 8 9 10 7
. 11 (14) 15 (12)하면 (13)은 인
16 17 19 20 18이있다
21 22 23 24 25 임
갑자기 모르는 얼마나 지방 4
어서 그래서 우리가 할 수있는 교류
AC에 시간
추신표류하지 포인터 배열 범위를 계산에 포함되지 않습니다주의하십시오.
적어도 1,001 * 1,001 바의 배열 열기
#include<unordered_map>
#include<algorithm>
#include<iostream>
#include<string.h>
#include<utility>
#include<stdio.h>
#include<vector>
#include<string>
#include<math.h>
#include<cmath>
#include<queue>
#include<stack>
#include<deque>
#include<map>
#pragma warning(disable:4244)
#define PI 3.1415926536
#pragma GCC optimize(2)
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
const ll ll_inf = 9223372036854775807;
const int int_inf = 2147483647;
const short short_inf = 32767;
const char char_inf = 127;
inline ll read() {
ll c = getchar(), Nig = 1, x = 0;
while (!isdigit(c) && c != '-')c = getchar();
if (c == '-')Nig = -1, c = getchar();
while (isdigit(c))x = ((x << 1) + (x << 3)) + (c ^ '0'), c = getchar();
return Nig * x;
}
inline void out(ll a)
{
if (a < 0)putchar('-'), a = -a;
if (a >= 10)out(a / 10);
putchar(a % 10 + '0');
}
ll qpow(ll x, ll n, ll mod) {
ll res = 1;
while (n > 0) {
if (n & 1)res = (res * x) % mod;
x = (x * x) % mod; n >>= 1;
}
return res;
}
#define read read()
int fa[1010025];
int find(int x) {
return fa[x] == x ? x : fa[x] = find(fa[x]);
}
void merge(int x, int y) {
int fx = find(x), fy = find(y);
if (fx != fy)fa[fx] = fy;
}
int main()
{
for (int i = 1; i < 1010025; i++)fa[i] = i;
int x = read, y = read;
int x1, x2, y1, y2;
int tot = 0;
int num1, num2;
while (scanf("%d%d%d%d", &x1, &y1, &x2, &y2) != EOF)
{
num1 = (x1 - 1) * y + y1;
num2 = (x2 - 1) * y + y2;
merge(num1, num2);
}
for (int j = 1; j <= y; j++)
for (int i = 1; i < x; i++)
{
num1 = (i - 1) * y + j;
num2 = num1 + y;
if (find(num1) != find(num2))
{
tot++;
merge(num1, num2);
}
}
for (int i = 1; i <= x; i++)
for (int j = 1; j < y; j++)
{
num1 = (i - 1) * y + j;
num2 = num1 + 1;
if (find(num1) != find(num2))
{
tot += 2;
merge(num1, num2);
}
}
cout << tot << endl;
}
부산물 휠 달