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);
}
因为顶点编号
灌水遍历
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;
}