【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 [算法] 维护两个栈,一个栈放光标之前的数,另外一个放光标之后的数 在维护栈的同时求最大前缀 ...
随机推荐
- hdu-5920 Ugly Problem(贪心+高精度)
题目链接: Ugly Problem Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Other ...
- UVA 103 Stacking Boxes --LIS
实际上是一个扩展维度的矩形嵌套问题. 一个物体能嵌入另一个物体中,当且仅当这个物体的所有维度的长度都小于另外一个(本题是小于等于),又因为可以旋转等变换,所以干脆将每个箱子的边从小到大排序,以便于判断 ...
- sql 入门经典(第五版) Ryan Stephens 学习笔记 第四部分:建立复杂的数据库查询/
第十三章: 在查询表里结合表 1.等值结合 : // 选择 tabla_a 和table_b 中id相等的行,输出 他们的id 和name select table_a.id , table_a.na ...
- java11-6 String类的其它功能
String类的其他功能: 替换功能: String replace(char old,char new) String replace(String old,String new) 去除字符串两空格 ...
- java9-4 包
面试题: package,import,class有没有顺序关系? 有. package > import > class Package:只能有一个 import:可以有多个 class ...
- 分享一个刷网页PV的python小脚本
下面分享一个小脚本,用来刷网页PV. [root@huanqiu ~]# cat www.py #!/usr/bin/python# coding: UTF-8import webbrowser as ...
- Html之初体验
概述 HTML是英文Hyper Text Mark-up Language(超文本标记语言)的缩写,他是一种制作万维网页面标准语言.相当于定义统一的一套规则,大家都来遵守他,这样就可以让浏览器根据标记 ...
- 【转】MySQL 性能优化的最佳20多条经验分享
今天,数据库的操作越来越成为整个应用的性能瓶颈了,这点对于Web应用尤其明显.关于数据库的性能,这并不只是DBA才需要担心的事,而这更是我们程序员需要去关注的事情. 当我们去设计数据库表结构,对操 ...
- 每日一SQL-善用DATEADD和DATEDIFF
转自:http://www.dotblogs.com.tw/lastsecret/archive/2010/10/04/18097.aspx 上個星期去Tech-Day聽了幾場有趣的課,其中一堂是楊志 ...
- Android自动化压力测试图解教程——Monkey工具
[置顶] Android自动化压力测试图解教程--Monkey工具 标签: 测试androidprofiling工具测试工具文档 2012-04-01 10:16 38185人阅读 评论(10) 收藏 ...