首页 > 其他分享 >P1197 [JSOI2008] 星球大战 题解

P1197 [JSOI2008] 星球大战 题解

时间:2024-01-28 19:35:51浏览次数:32  
标签:删除 int 题解 JSOI2008 num MAXN kkk P1197

P1197 [JSOI2008] 星球大战 题解

题目链接

P1197 [JSOI2008] 星球大战

简要思路

看完题目的第一印象是——连通性

图论中判断连通性很容易想到并查集,但是并查集只支持合并和查询,并不支持删除,怎么办呢?

考虑逆向思维,把删点的过程倒过来,看成加点和连边,那么此题就可以非常方便的用并查集来解决了。

和平就是好。

我们先把所有没被删除过的点建图,用并查集来维护。

之后倒着把每次删除的点加入,然后遍历它的所有连边,如果连边的终点没有被删除,那么我们就用并查集合并这两个点,并记录至答案数组中。

最后倒序输出答案数组即可。

完整代码

#include<bits/stdc++.h>
#define int long long
#define endl '\n'
const int MAXN=4e5+5;

int n,m,k;
int x[MAXN],y[MAXN],kkk[MAXN];//kkk[i] 表示第 i 个被删除的点
bool f[MAXN];//f[i] 代表点 i 是否被删除
int ans[MAXN],num;//num 连通块数量
int fa[MAXN];
std::vector<int> v[MAXN];

void add(int s,int e){v[s].push_back(e);v[e].push_back(s);}//加边
void init(){for(int i=0;i<n;i++)fa[i]=i;}//并查集初始化
int find(int x){return x==fa[x]?x:fa[x]=find(fa[x]);}//路径压缩
void merge(int x,int y){int fx=find(x),fy=find(y);if(fx!=fy){num--;fa[fy]=fx;}}//启发式合并[维护连通块数量]

signed main(){
	std::ios::sync_with_stdio(false);
	std::cin.tie(0);
	
	std::cin>>n>>m;
	init();//并查集初始化[一定要在输入 n 之后,因为这个卡了 1.5h]
	for(int i=1;i<=m;i++){
		std::cin>>x[i]>>y[i];
		add(x[i],y[i]);//加边
	}

	std::cin>>k;
	for(int i=1;i<=k;i++)std::cin>>kkk[i],f[kkk[i]]=1;

	num=n-k;//一个点为一个连通块
	for(int i=1;i<=m;i++)//遍历所有边
		if(!f[x[i]]&&!f[y[i]])merge(x[i],y[i]);//保证点存在

	ans[k+1]=num;
	for(int i=k;i>=1;i--){
		int x=kkk[i];
		num++;//新增一个被删除的点
		f[x]=0;//被删除的点恢复
		for(int j=0;j<v[x].size();j++)
			if(!f[v[x][j]])merge(x,v[x][j]);//保证终点存在
		ans[i]=num;
	}
	
	for(int i=1;i<=k+1;i++)std::cout<<ans[i]<<endl;//倒序输出

	return 0;
}

标签:删除,int,题解,JSOI2008,num,MAXN,kkk,P1197
From: https://www.cnblogs.com/CheZiHe929/p/17993170

相关文章

  • 洛谷题解-P1938 [USACO09NOV] Job Hunt S
    https://www.luogu.com.cn/problem/P1938题目描述Bessieisrunningoutofmoneyandissearchingforjobs.FarmerJohnknowsthisandwantsthecowstotravelaroundsohehasimposedarulethathiscowscanonlymakeD(1<=D<=1,000)dollarsinac......
  • ATtokiomarine2020E O(rand) 题解
    题目链接点击打开链接题目解法首先,\(S\)一定要是\(T\)的子集先筛出符合条件的\(a_i\),即满足\(S\subseteqa_i\subseteqT\)令\(dif\)为\(T-S\),定义数\(x\)覆盖第\(y\)位为二进制下\(x\)的第\(y\)位为\(1\)现在的问题变成了找到大小\(\lek\)的\(\{a_i\}......
  • 洛谷题解-P2888 [USACO07NOV] Cow Hurdles S (Floyd)
    https://www.luogu.com.cn/problem/P2888题目描述FarmerJohnwantsthecowstoprepareforthecountyjumpingcompetition,soBessieandthegangarepracticingjumpingoverhurdles.Theyaregettingtired,though,sotheywanttobeabletouseaslittleene......
  • ABC338 F Negative Traveling Salesman 题解
    QuestionABC338FNegativeTravelingSalesman给出一个\(N\)个点\(M\)条边的有向图,边权可能为负数,但不可能有负环每经过一条边就要加上这条边的代价求,一条路径经过所有的点,并且要求总代价最小Solution观察到\(N\le20\)自然而然想到状压因为多次经过一条边的代价是......
  • CF1423G Growing flowers题解
    考虑每种颜色的贡献,用总数\(n-k+1\)减去没有贡献到的(极长连续段长度为\(len\)时),贡献为\(\max(len-k+1,0)\),所以考虑用\(\text{ODT}\)维护所有颜色的连续段。具体的,维护一个大的\(ODT\)存储所有连续段,再对每个颜色存储自己的连续段,用\(\text{BIT}\)维护每个长度的极长......
  • ABC338 D Island Tour 题解
    Question有\(n\)座海岛由\(n\)条桥连着,第\(i\)座桥连接第\(i\)和\(i+1\)座海岛,第\(n\)座桥连接第\(n\)和\(1\)座海盗有一条长度为\(m\)的旅游路线,第\(X_i\)表示依次到达的岛屿现在需要切断一条桥,求总旅游路线最小值Solution显然,从第\(X_{i-1}\)到\(X_......
  • ABC338 E Chords 题解
    Question一个圆上有\(2N\)个点均匀分布,给出\(N\)条线,每条线连接两个顶点问,有没有两条线相交Solution也算一个比较典的题目考虑到这种两两配对,配对中有没有交错关系的可以考虑异或哈希因为一个数异或两次等于它本身,所以我们可以用异或来实现一个“撤销”操作我们当我......
  • UVA10852 的题解
    UVA10852的题解题目大意给定自然数\(n(100\leqn\leq10000)\),寻找质数\(x\len\),使得\(p\timesx\leqn<(p+1)\timesx\)且\(n-p\timesx\)最大。思路不难发现,\(p\)其实就是$\left\lfloor\frac{n}{x}\right\rfloor$,所以,我们只要找到对应的\(x\),\(p\)的只就......
  • 洛谷题解-P3003 [USACO10DEC] Apple Delivery S (dijkstra)
    题目描述Bessiehastwocrispredapplestodelivertotwoofherfriendsintheherd.Ofcourse,shetravelstheC(1<=C<=200,000)cowpathswhicharearrangedastheusualgraphwhichconnectsP(1<=P<=100,000)pasturesconvenientlynumb......
  • CF765F Souvenirs 题解
    题目链接:CF或者洛谷想了很久,然后想起做过的一道题:秃子酋长,一开始以为差不多,结果写着写着就发现不对劲了。最后写出了个神仙回滚莫队解法,感觉很妙,记录下。进入神仙分析时刻首先,我们来考虑一个事实,加上一个数以后,如果能找到它的前后驱,那么可以立马更新最优解,这个也即是瓶颈点。......