9708-开车搜集宝物


本文总阅读量

灌水题。题意概括后就是找一个点权和最大的连通图。所以可以用灌水的方式计算点权之和,然后找到点权之和最大值。学过并查集,也可以用并查集计算。

构图(储存)

	for(int i = 1,x,y; i <= m; i++){
		cin>>x>>y;
		x++;
		y++;
		G[x].push_back(y);
		G[y].push_back(x);
	}

因为顶点编号0n1,为了方便处理,编号加1

灌水遍历

	for(int i = 1; i <= n; i++){
		if(vis[i]==0){
			ans=max(ans,dfs(i));
		}
	}

图的遍历

int dfs(int x)
{
	vis[x] = 1;
	int s = a[x];  //s点权之和
	for(auto y:G[x]){
		if(vis[y]==0){
			s += dfs(y); //搜索以y为起点的子图的点权之和
		}
	}
	return s;
}

本站总访问量