Tyvj P2044 ["掃地"杯III day2]旅遊景點
阿新 • • 發佈:2017-08-31
當前 [] targe include lan tdi pan pri 二次
二次聯通門 : Tyvj P2044 ["掃地"杯III day2]旅遊景點
/* Tyvj P2044 ["掃地"杯III day2]旅遊景點 並查集 先把大於K的點合並 再從頭掃一遍 若當前邊的兩邊不在同一個集合就合並 否則就割掉這條邊 */ #include <cstdio> #include <iostream> const int BUF = 12312313; char Buf[BUF], *buf = Buf; inline void read (int &now) { for(now = 0; !isdigit (*buf); ++ buf); for (; isdigit (*buf); now = now * 10 + *buf - ‘0‘, ++ buf); } #define Max 100009 struct E { int u, v; }; int f[Max]; E e[Max << 1]; int Find (int x) { return f[x] == x ? x : f[x] = Find (f[x]); } int main (int argc, char *argv[]) { freopen ("1.in", "r", stdin); fread (buf, 1, BUF, stdin); int N, M, K, x, y, Answer = 0; register int i, j; read (N), read (M), read (K); for (i = 1; i <= N; ++ i) f[i] = i; for (i = 1; i <= M; ++ i) { read (e[i].u), read (e[i].v); if (e[i].u > K && e[i].v > K) { x= Find (e[i].u), y = Find (e[i].v); f[x] = f[y]; } } for (i = 1; i <= M; ++ i) { if (e[i].u > K && e[i].v > K) continue; x = Find (e[i].u), y = Find (e[i].v); if (x != y) f[x] = y; else ++ Answer; } printf ("%d", Answer); return 0; }
Tyvj P2044 ["掃地"杯III day2]旅遊景點