UPC- 계통 연결

아무리 높은 산, 등산, 항상 올라,
도로가에 가서 오래있을 수에 도달 할 수있을 것입니다.

링크 포인트

제목 설명

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;
}

부산물 휠 달

게시 32 개 원래 기사 · 원의 찬양 (11) · 전망 1178

추천

출처blog.csdn.net/qq_35339563/article/details/104907584