【XSY2469】graph 分治 并查集
生活随笔
收集整理的這篇文章主要介紹了
【XSY2469】graph 分治 并查集
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
題目大意
給你一張\(n\)個點\(m\)條邊的無向圖,問刪去每個點后,原圖是不是二分圖。
\(n,m\leq 100000\)
題解
一個圖是二分圖\(\Longleftrightarrow\)該圖不存在奇環(huán)
可以用并查集,維護每個點到根的距離
如果刪除\(x\)點,就要把所有不與\(x\)連接的邊加入并查集
考慮分治,對于區(qū)間\([l,r]\),我們先把與\([l,mid]\)鏈接且不與\([mid+1,r]\)鏈接的邊加入并查集,然后遞歸處理\([mid+1,r]\)。另一邊的情況類似。
因為有撤銷操作,所以要用按秩合并的并查集
時間復雜度:\(O(m\log^2 n)\)
代碼
#include<cstdio> #include<cstring> #include<algorithm> #include<cstdlib> #include<ctime> #include<utility> using namespace std; typedef long long ll; typedef pair<int,int> pii; struct list {int v[200010];int t[200010];int h[100010];int n;void clear(){memset(h,0,sizeof h);n=0;}void add(int x,int y){n++;v[n]=y;t[n]=h[x];h[x]=n;} }; list li; int f[100010]; int s[100010]; int d[100010]; int find(int x) {return f[x]==x?x:find(f[x]); } int getdist(int x) {return f[x]==x?0:getdist(f[x])^d[x]; } int e1[100010]; int e2[100010]; int top; int ans[100010]; int merge(int x,int y) {int dist=getdist(x)^getdist(y)^1;if((x=find(x))==(y=find(y)))return dist;top++;if(s[x]<=s[y]){e1[++top]=x;e2[top]=y;d[x]=dist;s[y]+=s[x];f[x]=y;}else{e1[++top]=y;e2[top]=x;d[y]=dist;s[x]+=s[y];f[y]=x;}return 0; } void solve(int l,int r) {if(l==r){ans[l]=1;return;}int mid=(l+r)>>1;int now=top;int i,j;int b=1;for(i=l;i<=mid&&b;i++)for(j=li.h[i];j&&b;j=li.t[j])if(li.v[j]<=mid||li.v[j]>r)b^=merge(i,li.v[j]);if(b)solve(mid+1,r);elsefor(i=mid+1;i<=r;i++)ans[i]=0;while(top>now){f[e1[top]]=e1[top];s[e2[top]]-=s[e1[top]];top--;}now=top;b=1;for(i=mid+1;i<=r&&b;i++)for(j=li.h[i];j&&b;j=li.t[j])if(li.v[j]<l||li.v[j]>mid)b^=merge(i,li.v[j]);if(b)solve(l,mid);elsefor(i=l;i<=mid;i++)ans[i]=0;while(top>now){f[e1[top]]=e1[top];s[e2[top]]-=s[e1[top]];top--;} } void solve() {top=0;int n,m;scanf("%d%d",&n,&m);int i;int x,y;li.clear();for(i=1;i<=m;i++){scanf("%d%d",&x,&y);li.add(x,y);li.add(y,x);}for(i=1;i<=n;i++){f[i]=i;s[i]=1;}solve(1,n);for(i=1;i<=n;i++)putchar(ans[i]+'0');putchar('\n'); } int main() { // freopen("c.in","r",stdin); // freopen("c.out","w",stdout);int t;scanf("%d",&t);while(t--)solve();return 0; }轉載于:https://www.cnblogs.com/ywwyww/p/8511056.html
總結
以上是生活随笔為你收集整理的【XSY2469】graph 分治 并查集的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: p1、查询端口号占用,根据端口查看进程信
- 下一篇: 感谢Thunder团队