bzoj#4423-[AMPPZ2013]Bytehattan【并查集】
生活随笔
收集整理的這篇文章主要介紹了
bzoj#4423-[AMPPZ2013]Bytehattan【并查集】
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
正題
題目鏈接:https://darkbzoj.tk/problem/4423
題目大意
給出一個n?nn*nn?n的網(wǎng)格圖,然后四聯(lián)通的點之間連接。每次刪掉一條邊求這條邊的兩個點是否連通。強制在線。
1≤n≤1500,1≤m≤2n(n?1)1\leq n\leq 1500,1\leq m\leq 2n(n-1)1≤n≤1500,1≤m≤2n(n?1)
解題思路
轉(zhuǎn)換成對偶圖之后就可以變成加邊判斷連通性的問題了。
一個很簡單的理解就是如果新的刪去的邊在對偶圖構(gòu)成了一個環(huán)那么就會被分成環(huán)內(nèi)和環(huán)外了。
時間復(fù)雜度O(mα(m))O(m\alpha(m))O(mα(m))
code
#include<cstdio> #include<cstring> #include<algorithm> using namespace std; const int N=1600; int n,k,fa[N*N]; int find(int x) {return (fa[x]==x)?(x):(fa[x]=find(fa[x]));} void Unionm(int x,int y){x=find(x);y=find(y);if(x==y)return;fa[x]=y; } int main() {scanf("%d%d",&n,&k);bool last=1;for(int i=1;i<=(n+1)*(n+1);i++)fa[i]=i;for(int i=1;i<=n;i++){Unionm(i,i+1);Unionm((i-1)*(n+1)+1,i*(n+1)+1);Unionm(n*(n+1)+i,n*(n+1)+i+1);Unionm((i-1)*(n+1)+n+1,i*(n+1)+n+1);}for(int i=1;i<=k;i++){int x1,x2,y1,y2,x,y,p,q;char op1[2],op2[2],op;scanf("%d%d%s",&x1,&y1,&op1);scanf("%d%d%s",&x2,&y2,&op2);if(last)x=x1,y=y1,op=op1[0];else x=x2,y=y2,op=op2[0];if(op=='N'){p=x*(n+1)+y+1;q=(x-1)*(n+1)+y+1;p=find(p);q=find(q);if(p!=q)last=1,puts("TAK");else last=0,puts("NIE");}else{p=x*(n+1)+y+1;q=x*(n+1)+y;p=find(p);q=find(q);if(p!=q)last=1,puts("TAK");else last=0,puts("NIE");}Unionm(p,q);}return 0; }總結(jié)
以上是生活随笔為你收集整理的bzoj#4423-[AMPPZ2013]Bytehattan【并查集】的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: LG电子预计OLED电视今年出货量将同比
- 下一篇: CF835E-The penguin‘s