日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

bzoj 1015 并查集

發布時間:2023/12/13 编程问答 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 bzoj 1015 并查集 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

?

代碼:

//這題可以反著想,把要去掉的點倒著處理變成往圖中一個一個的加點,然后用并查集處理聯通快就好了。 #include<iostream> #include<cstdio> #include<cstring> #include<vector> using namespace std; const int MAXN=400000; int fa[MAXN+10],des[MAXN+10],ans[MAXN+10],head[MAXN+10],n,m,k,tot; bool use[MAXN+10]; struct Edge {int to,next; }edge[MAXN*2+10]; void init() {tot=0;for(int i=0;i<n;i++){fa[i]=i;use[i]=1;head[i]=-1;} } void add(int x,int y) {edge[tot].to=y;edge[tot].next=head[x];head[x]=tot++; } int find(int x) {return x==fa[x]?x:fa[x]=find(fa[x]);} int main() {scanf("%d%d",&n,&m);init();for(int i=1;i<=m;i++){int x,y;scanf("%d%d",&x,&y);add(x,y);add(y,x);}scanf("%d",&k);for(int i=1;i<=k;i++){scanf("%d",&des[i]);use[des[i]]=0;}int tmp=0;for(int i=0;i<n;i++){if(!use[i]) continue;tmp++;for(int j=head[i];j!=-1;j=edge[j].next){int x=edge[j].to;if(!use[x]) continue;int ii=find(i),xx=find(x);if(ii!=xx){fa[ii]=xx;tmp--;}}}ans[k]=tmp;for(int i=k;i>=1;i--){int x=des[i];use[x]=1;tmp++;for(int j=head[x];j!=-1;j=edge[j].next){int y=edge[j].to;if(!use[y]) continue;int xx=find(x),yy=find(y);if(xx!=yy){fa[xx]=yy;tmp--;}}ans[i-1]=tmp;}for(int i=0;i<=k;i++)printf("%d\n",ans[i]);return 0; }

?

轉載于:https://www.cnblogs.com/--ZHIYUAN/p/7445828.html

總結

以上是生活随笔為你收集整理的bzoj 1015 并查集的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。