打卡信奥刷题(2993)用C++实现信奥题 P6121 [USACO16OPEN] Closing the Farm G
P6121 [USACO16OPEN] Closing the Farm G题目背景本题和 银组同名题目 在题意上一致唯一的不同是数据范围。题目描述FJ 和他的奶牛们正在计划离开小镇做一次长的旅行同时 FJ 想临时地关掉他的农场以节省一些金钱。这个农场一共有被用M MM条双向道路连接的N NN个谷仓1 ≤ N , M ≤ 2 × 10 5 1 \leq N,M \leq 2 \times 10^51≤N,M≤2×105。为了关闭整个农场FJ 计划每一次关闭掉一个谷仓。当一个谷仓被关闭了所有的连接到这个谷仓的道路都会被关闭而且再也不能够被使用。FJ 现在正感兴趣于知道在每一个时间这里的“时间”指在每一次关闭谷仓之前的时间时他的农场是否是“全连通的”——也就是说从任意的一个开着的谷仓开始能够到达另外的一个谷仓。注意自从某一个时间之后可能整个农场都开始不会是“全连通的”。输入格式输入第一行两个整数N , M N,MN,M。接下来M MM行每行两个整数u , v u,vu,v1 ≤ u , v ≤ N 1 \leq u,v \leq N1≤u,v≤N描述一条连接u , v u,vu,v两个农场的路。最后N NN行每行一个整数表示第i ii个被关闭的农场编号。输出格式输出N NN行每行包含YES或NO表示某个时刻农场是否是全连通的。第一行输出最初的状态第i ii行2 ≤ i ≤ N 2 \leq i \leq N2≤i≤N输出第i − 1 i-1i−1个农场被关闭后的状态。输入输出样例 #1输入 #14 3 1 2 2 3 3 4 3 4 1 2输出 #1YES NO YES YESC实现#includebits/stdc.husingnamespacestd;vectorinte[200005];intf[200005];intm,n;intfind(intx){if(f[x]x)returnx;returnf[x]find(f[x]);}intmerge(intx,inty){if(find(x)find(y))return0;f[find(x)]find(y);return1;}//标准的并查集操作intl,r;intdel[200005];//删除的点intsum;//联通块数量boolok[200005];//是否全部连通intmain(){scanf(%d%d,n,m);for(registerinti1;im;i){scanf(%d%d,l,r);e[l].push_back(r);e[r].push_back(l);}//vector存储边是双向存储for(registerinti1;in;i)scanf(%d,del[i]);for(registerintin;i1;i--){//倒序枚举删除点intxdel[i];f[x]x;//初始化 如果在之前全部初始化了不好判断是否枚举过sum;//加一个点联通块数量之后再进行操作for(vectorint::iterator ite[x].begin();it!e[x].end();it){inty*it;if(!f[y])continue;//如果还没有加这个点因为之前的初始化sum-merge(x,y);//如果可以连通合并之后联通块--}if(sum1)ok[i]true;//联通块为1的话说明全部连通}for(registerinti1;in;i){//正序输出if(ok[i]true)puts(YES);elseputs(NO);}return0;}后续接下来我会不断用C来实现信奥比赛中的算法题、GESP考级编程题实现、白名单赛事考题实现记录日常的编程生活、比赛心得感兴趣的请关注我后续将继续分享相关内容
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2440459.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!