【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 [算法] 维护两个栈,一个栈放光标之前的数,另外一个放光标之后的数 在维护栈的同时求最大前缀 ...
随机推荐
- MySQL数据库学习笔记(六)----MySQL多表查询之外键、表连接、子查询、索引
本章主要内容: 一.外键 二.表连接 三.子查询 四.索引 一.外键: 1.什么是外键 2.外键语法 3.外键的条件 4.添加外键 5.删除外键 1.什么是外键: 主键:是唯一标识一条记录,不能有重复 ...
- Unity 2D Touch Movement
Demo试玩(Kongregate既然也有广告时间了 --!)http://www.kongregate.com/games/zhaoqingqing/2d-touch-movement 操作步骤 1 ...
- this关键字的使用
一,表示类中属性 1,没有使用this的情况 class Person{ // 定义Person类 private String name ; // 姓名 private int age ; // 年 ...
- Netty指定分隔的字符
package org.zln.netty.five.part02; import io.netty.buffer.ByteBuf; import io.netty.buffer.Unpooled; ...
- Windows Phone 简介
中文官网 https://dev.windowsphone.com/zh-cn Windows Phone SDK 7.1 http://www.microsoft.com/zh-cn/downloa ...
- 多个相同jar存在时的引用顺序
起因:今天一个aar包在测试环境中正常运行,使用soapui测试正常返回,在本地环境中运行则老是报数据库连接异常,经检查,是因为在运行时环境中缺少ojdbc相关的jar包引起的. 重新打了一个aar包 ...
- JQuery 如何选择带有多个class的元素
Q: 比如下面代码需要选择同时带有这几个class的元素,怎么写? 1 <div class="modal fade in"></div> A: 1. 依次 ...
- An Introduction to Interactive Programming in Python (Part 1) -- Week 2_3 练习
Mini-project description - Rock-paper-scissors-lizard-Spock Rock-paper-scissors is a hand game that ...
- 动态执行SQL语句
在实际制作过程中,需要动态的拼接SQL语句然后执行.具体代码如下: declare @columnName varchar(20),@tempName varchar(20) select @temp ...
- Android -- 使用inBitmap要注意的地方
SDK版本 需要注意的是inBitmap只能在3.0以后使用.2.3上,bitmap的数据是存储在native的内存区域,并不是在Dalvik的内存堆上. 在android3.0开始,系统在Bitma ...