不断删去度数为1的点,最后求有奇数个点的联通块的权值之和。

分析

存边的时候,要头尾都存这个边。用dfs或者队列删点,再用并查集或者dfs确定联通块,然后统计联通块的点数,最后累加。

我自己写的超时,然后参考了网上的题解。真郁闷。

代码

并查集

#include<cstdio>
#include<queue>
#include<vector>
#define ll long long using namespace std; const int N = 1e4 + ; ll v[N];
ll s[N];
int n,m,e[N],f[N],cn[N];
vector<int> d[N]; int find(int a)
{
return f[a]==a?a:find(f[a]);
} void unite(int a,int b)
{
a=find(a),b=find(b);
if(a!=b) f[a]=b;
} void add(int a,int b)
{
e[a]++;
e[b]++;
d[a].push_back(b);
d[b].push_back(a);
unite(a,b);
} void del()
{
queue<int>q;
for(int i=; i<=n; i++) if(e[i]==) q.push(i);
while(!q.empty())
{
int r=q.front();
q.pop();
for(int j=; j<d[r].size(); j++)
{
int w=d[r][j];
e[w]--;
if(e[w]==)q.push(w);
}
}
}
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
scanf("%d%d",&n,&m);
for(int i=; i<=n; i++)
{
scanf("%lld",&v[i]);
e[i]=s[i]=cn[i]=;
f[i]=i;
d[i].clear();
}
for(int i=; i<=m; i++)
{
int a,b;
scanf("%d%d",&a,&b);
add(a,b);
}
del();
for(int i=; i<=n; i++)
{
if(e[i]>)
{
int a=find(i);
s[a]+=v[i];
cn[a]++;
}
}
ll ans=;
for(int i=; i<=n; i++)
{
if (f[i]==i && cn[i]&)
{
ans+=s[i];
}
}
printf("%lld\n",ans);
}
return ;
}

dfs确定联通块

#include<cstdio>
#include<queue>
#include<vector>
#define ll long long using namespace std; const int N = 1e4 + ; ll v[N];
int n,m,e[N],vis[N];
ll ct,sum;
vector<int> d[N]; void add(int a,int b)
{
e[a]++;
e[b]++;
d[a].push_back(b);
d[b].push_back(a);
}
void dfs(int a)
{
vis[a]=;
sum+=v[a];
ct++;
for(int i=; i<d[a].size(); i++)
{
int w=d[a][i];
if(!vis[w]) dfs(w);
}
}
void del()
{
queue<int>q;
for(int i=; i<=n; i++)
{
if(e[i]==) q.push(i);
if(e[i]==) vis[i]=; // 别忘了度为0的点
}
while(!q.empty())
{
int r=q.front();
vis[r]=;
q.pop();
for(int j=; j<d[r].size(); j++)
{
int w=d[r][j];
e[w]--;
if(e[w]==)q.push(w);
}
}
}
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
scanf("%d%d",&n,&m);
for(int i=; i<=n; i++)
{
scanf("%lld",&v[i]);
e[i]=vis[i]=;
d[i].clear();
}
for(int i=; i<=m; i++)
{
int a,b;
scanf("%d%d",&a,&b);
add(a,b);
}
del();
ll ans=;
for(int i=; i<=n; i++)
{
sum=ct=;
if(!vis[i]) dfs(i);
if(ct&)ans+=sum;
}
printf("%lld\n",ans);
}
return ;
}

【HDU 5438】Ponds的更多相关文章

  1. 【数位dp】【HDU 3555】【HDU 2089】数位DP入门题

    [HDU  3555]原题直通车: 代码: // 31MS 900K 909 B G++ #include<iostream> #include<cstdio> #includ ...

  2. 【HDU 5647】DZY Loves Connecting(树DP)

    pid=5647">[HDU 5647]DZY Loves Connecting(树DP) DZY Loves Connecting Time Limit: 4000/2000 MS ...

  3. -【线性基】【BZOJ 2460】【BZOJ 2115】【HDU 3949】

    [把三道我做过的线性基题目放在一起总结一下,代码都挺简单,主要就是贪心思想和异或的高斯消元] [然后把网上的讲解归纳一下] 1.线性基: 若干数的线性基是一组数a1,a2,a3...an,其中ax的最 ...

  4. 【HDU 2196】 Computer(树的直径)

    [HDU 2196] Computer(树的直径) 题链http://acm.hdu.edu.cn/showproblem.php?pid=2196 这题可以用树形DP解决,自然也可以用最直观的方法解 ...

  5. 【HDU 2196】 Computer (树形DP)

    [HDU 2196] Computer 题链http://acm.hdu.edu.cn/showproblem.php?pid=2196 刘汝佳<算法竞赛入门经典>P282页留下了这个问题 ...

  6. 【HDU 5145】 NPY and girls(组合+莫队)

    pid=5145">[HDU 5145] NPY and girls(组合+莫队) NPY and girls Time Limit: 8000/4000 MS (Java/Other ...

  7. 【hdu 1043】Eight

    [题目链接]:http://acm.hdu.edu.cn/showproblem.php?pid=1043 [题意] 会给你很多组数据; 让你输出这组数据到目标状态的具体步骤; [题解] 从12345 ...

  8. 【HDU 3068】 最长回文

    [题目链接] http://acm.hdu.edu.cn/showproblem.php?pid=3068 [算法] Manacher算法求最长回文子串 [代码] #include<bits/s ...

  9. 【HDU 4699】 Editor

    [题目链接] http://acm.hdu.edu.cn/showproblem.php?pid=4699 [算法] 维护两个栈,一个栈放光标之前的数,另外一个放光标之后的数 在维护栈的同时求最大前缀 ...

随机推荐

  1. RabbitMQ 一二事 - 简单队列使用

    消息队列目前流行的有三种 1. RabbitMQ 2. ActiveMQ 3. Kafka 这三种都非常强大,RabbitMQ目前用的比较多,也比较流行,阿里也在用 ActiveMQ是阿帕奇出品,但是 ...

  2. nginx 一二事(2) - 创建虚拟静态服务器

    一.什么是nginx 是一个C语言开发的HTTP反向代理服务器,性能非常高 一个俄罗斯的哥们开发的,官方提供的测试性能能够达到5W的并发,我的天呐~,实际测试差不多是2W,而淘宝的牛人可以优化到200 ...

  3. MySQL数据库学习笔记(十一)----DAO设计模式实现数据库的增删改查(进一步封装JDBC工具类)

    [声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/4 ...

  4. 合唱队形2 洛谷U5874

    题目背景 上次老师挑出来的(N-K)位同学很不高兴,于是他们准备自己组建合唱队形.他们请了kkk来帮忙. 题目描述 他们安排了一个动作——手拉着手唱一首歌(就是他们围成一个圈).如果有两个相邻的同学的 ...

  5. java 13-3 int类型的包装包Integer

    1.Integer的概述 需求1:把100这个数据的二进制,八进制,十六进制计算出来 需求2:判断一个数据是否是int范围内的.  首先你得知道int的范围是多大? 为了对基本数据类型进行更多的操作, ...

  6. js的nextSibling,属性兼容IE和FF等浏览器

    Firefox中 空白字符,比如回车,空格等也算作一个Node 就是firstChild,nextsbiling这两个.下面给出函数吧.还是代码比较说明问题代码都是网上来的.不过要注意的是,getNe ...

  7. onresize方法

    resize()方法可以写在当前页面包含的所有js里

  8. 搭建一个Web应用

    因为EasyUI会涉及到与后台数据的交互,所以使用Spring MVC作为后台,搭建一个完整的Web环境 使用gradle作为构建工具 build.gradle group 'org.zln.lkd' ...

  9. Socket Programming in C#--Server Side

    Server Side If you have understood whatever I have described so far, you will easily understand the ...

  10. no2.crossdomain.xml批量读取(待完善)

    读取太多url有问题 #coding=utf-8 import urllib import requests import sys import re import time def getxml(u ...