博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【HDU 5438】Ponds
阅读量:6804 次
发布时间:2019-06-26

本文共 1483 字,大约阅读时间需要 4 分钟。

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

分析

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

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

代码

并查集

#include
#include
#include
#define ll long longusing namespace std;const int N = 1e4 + 10;ll v[N];ll s[N];int n,m,e[N],f[N],cn[N];vector
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
q; for(int i=1; i<=n; i++) if(e[i]==1) q.push(i); while(!q.empty()) { int r=q.front(); q.pop(); for(int j=0; j
1) { int a=find(i); s[a]+=v[i]; cn[a]++; } } ll ans=0; for(int i=1; i<=n; i++) { if (f[i]==i && cn[i]&1) { ans+=s[i]; } } printf("%lld\n",ans); } return 0;}

 

dfs确定联通块

#include
#include
#include
#define ll long longusing namespace std;const int N = 1e4 + 10;ll v[N];int n,m,e[N],vis[N];ll ct,sum;vector
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]=1; sum+=v[a]; ct++; for(int i=0; i
q; for(int i=1; i<=n; i++) { if(e[i]==1) q.push(i); if(e[i]==0) vis[i]=1; // 别忘了度为0的点 } while(!q.empty()) { int r=q.front(); vis[r]=1; q.pop(); for(int j=0; j

 

转载地址:http://xcjwl.baihongyu.com/

你可能感兴趣的文章
AsyncTask和Handler的对比
查看>>
05-线程间通讯
查看>>
CentOS7使用firewalld打开关闭防火墙与端口
查看>>
20135203齐岳 信息安全系统设计基础第三周学习总结(补充)
查看>>
dubbo+zookeeper的使用
查看>>
20050821:搬家了
查看>>
nodejs学习笔记
查看>>
Solr的安装及配置
查看>>
swift 学习- 26 -- 泛型
查看>>
002 C#学前入门
查看>>
Android 创建桌面快捷方式
查看>>
NPOI读取excel功能,兼容xls和xlsx
查看>>
通用业务系统基础平台(四) 行政管理
查看>>
poj2029 Get Many Persimmon Trees
查看>>
Linux用户和组的基础概念
查看>>
权限管理
查看>>
kafka消费组、消费者
查看>>
A股财报摘要历史数据查询Web API使用方法
查看>>
matlab查找回车字符
查看>>
深浅拷贝
查看>>