【HDU 5438】Ponds
题意
不断删去度数为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的更多相关文章
- 【数位dp】【HDU 3555】【HDU 2089】数位DP入门题
[HDU 3555]原题直通车: 代码: // 31MS 900K 909 B G++ #include<iostream> #include<cstdio> #includ ...
- 【HDU 5647】DZY Loves Connecting(树DP)
pid=5647">[HDU 5647]DZY Loves Connecting(树DP) DZY Loves Connecting Time Limit: 4000/2000 MS ...
- -【线性基】【BZOJ 2460】【BZOJ 2115】【HDU 3949】
[把三道我做过的线性基题目放在一起总结一下,代码都挺简单,主要就是贪心思想和异或的高斯消元] [然后把网上的讲解归纳一下] 1.线性基: 若干数的线性基是一组数a1,a2,a3...an,其中ax的最 ...
- 【HDU 2196】 Computer(树的直径)
[HDU 2196] Computer(树的直径) 题链http://acm.hdu.edu.cn/showproblem.php?pid=2196 这题可以用树形DP解决,自然也可以用最直观的方法解 ...
- 【HDU 2196】 Computer (树形DP)
[HDU 2196] Computer 题链http://acm.hdu.edu.cn/showproblem.php?pid=2196 刘汝佳<算法竞赛入门经典>P282页留下了这个问题 ...
- 【HDU 5145】 NPY and girls(组合+莫队)
pid=5145">[HDU 5145] NPY and girls(组合+莫队) NPY and girls Time Limit: 8000/4000 MS (Java/Other ...
- 【hdu 1043】Eight
[题目链接]:http://acm.hdu.edu.cn/showproblem.php?pid=1043 [题意] 会给你很多组数据; 让你输出这组数据到目标状态的具体步骤; [题解] 从12345 ...
- 【HDU 3068】 最长回文
[题目链接] http://acm.hdu.edu.cn/showproblem.php?pid=3068 [算法] Manacher算法求最长回文子串 [代码] #include<bits/s ...
- 【HDU 4699】 Editor
[题目链接] http://acm.hdu.edu.cn/showproblem.php?pid=4699 [算法] 维护两个栈,一个栈放光标之前的数,另外一个放光标之后的数 在维护栈的同时求最大前缀 ...
随机推荐
- JSP中文乱码问题《转》
之前总是碰到JSP页面乱码的问题,每次都是现在网上搜,然后胡乱改,改完也不明白原因. 这次正好作下总结,中文乱码就是因为编码不符,可能出现乱码有四个地方: 1 JSP编码乱码 2 HTML编码乱码 3 ...
- Python-面向对象编程
概述: 面向过程:根据业务逻辑从上到下写代码. 函数式:将某功能代码封装到函数中,以后便无需重复编写,进调用函数即可. 面向对象:对函数进行分类和封装,让开发“更快更好更强” 创建类和对象 面向对象编 ...
- javascript中的数组操作
1.数组的创建 var arrayObj = new Array(); //创建一个数组 var arrayObj = new Array([size]); //创建一个数组并指定长度,注意不是上限, ...
- 创建文本,innerHTML与createTextNode的使用
第一种:innerHTML p.innerHTML="124"; 除了这个还可以console.log(p.innerHTML) 弹出p里面的内容; 第二种:createTextN ...
- Iron man
儿子的手办在近期又新增一套钢铁侠,来自于淘宝的玩具推荐,这个推荐也得益于小美和他平日在淘宝商城里的各种玩具浏览,充分体现了现阶段对复仇者联盟成员的喜爱. 一套共六个,有着不同的颜色,但造型基本一致带L ...
- Java 数据类型和变量
1.1 基本类型与引用类型的区别 1.基本类型代表简单的数据类型,比如整数和字符,引用类型所引用的实例能表示任意一种复杂的数据类型. 2.基本类型仅表示数据类型,而引用类型所引用的实例除了表示复杂数据 ...
- [3]MVC3中使用Telerik(转)
ASP.NET MVC的Model元数据与Model模板:预定义模板 http://www.cnblogs.com/artech/archive/2012/05/02/model-metadata-a ...
- [tools]google神器浏览器下载
google神器下载 这是一款优化了的google浏览器 http://www.ccav1.me/chromegae.html
- 加密方式&数字签名
1,对称加密 2,混合加密 3.数字签名 4,带加密的数字签名
- C语言 原码--反码--补码
//原码,反码,补码 #include<stdio.h> #include<stdlib.h> //数值的表示方法——原码.反码和补码 //原码:最高位为符号位,其余各位为数值 ...