题意:给定一个图,然后让你把边数为1的结点删除,然后求连通块结点数为奇的权值和。

析:这个题要注意,如果删除一些结点后,又形成了新的边数为1的结点,也应该要删除,这是坑,其他的,先用并查集判一下环,然后再找连通环。

代码如下:

  1. #include <cstdio>
  2. #include <string>
  3. #include <cstdlib>
  4. #include <cmath>
  5. #include <iostream>
  6. #include <cstring>
  7. #include <set>
  8. #include <queue>
  9. #include <algorithm>
  10. #include <vector>
  11. #include <map>
  12. #include <cctype>
  13. using namespace std ;
  14. typedef long long LL;
  15. typedef pair<int, int> P;
  16. const int INF = 0x3f3f3f3f;
  17. const double inf = 0x3f3f3f3f3f3f3f;
  18. const double eps = 1e-8;
  19. const int maxn = 1e4 + 5;
  20. const int dr[] = {0, 0, -1, 1};
  21. const int dc[] = {-1, 1, 0, 0};
  22. int n, m;
  23. inline bool is_in(int r, int c){
  24. return r >= 0 && r < n && c >= 0 && c < m;
  25. }
  26. int p[maxn];
  27. int a[maxn];
  28. int Find(int x){ return x == p[x] ? x : p[x] = Find(p[x]); }
  29. int vis[maxn];
  30. vector<int> vv;
  31. vector<int> G[maxn];
  32.  
  33. bool dfs(int u, int fa){
  34. if(vis[u]) return true;
  35. if(!G[u].size()) return false;
  36. bool ok = false;
  37.  
  38. vis[u] = 1;
  39. for(int i = 0; i < G[u].size(); ++i){
  40. int v = G[u][i];
  41.  
  42. if(v == fa) continue;
  43.  
  44. if(dfs(v, u)) ok = true;
  45. }
  46.  
  47. if(ok) vv.push_back(u);
  48. return ok;
  49. }
  50.  
  51. int main(){
  52. int T;
  53. cin >> T;
  54. while(T--){
  55. scanf("%d %d", &n, &m);
  56. for(int i = 0; i <= n; ++i) p[i] = i;
  57. for(int i = 1; i <= n; ++i){ scanf("%d", &a[i]); G[i].clear(); }
  58.  
  59. memset(vis, 0, sizeof(vis));
  60. vector<int> v;
  61. // memset(in, 0, sizeof(in));
  62. int u, w;
  63. for(int i = 0; i < m; ++i){
  64. scanf("%d %d", &u, &w);
  65. int x = Find(u);
  66. int y = Find(w);
  67. G[u].push_back(w);
  68. G[w].push_back(u);
  69. // ++in[u];
  70. // ++in[w];
  71. if(x != y) p[y] = x;
  72. else v.push_back(u);
  73. }
  74.  
  75. LL ans = 0;
  76. sort(v.begin(), v.end());
  77. for(int i = 0; i < v.size(); ++i){
  78. if(i && v[i] == v[i-1]) continue;
  79. vv.clear();
  80. dfs(v[i], -1);
  81. if(vv.size() & 1){
  82. for(int j = 0; j < vv.size(); ++j)
  83. ans += a[vv[j]], a[vv[j]] = 0;
  84. }
  85. }
  86.  
  87. cout << ans << endl;
  88. }
  89. return 0;
  90. }
  91.  
  92. /*
  93. 1
  94. 4 4
  95. 1 2 3 4
  96. 1 2
  97. 1 3
  98. 2 3
  99. 1 4
  100.  
  101. */

HDU 5438 Ponds (DFS,并查集)的更多相关文章

  1. hdu 5438 Ponds dfs

    Time Limit: 1500/1000 MS (Java/Others)     Memory Limit: 131072/131072 K (Java/Others) Problem Descr ...

  2. HDU 5438 Ponds dfs模拟

    2015 ACM/ICPC Asia Regional Changchun Online 题意:n个池塘,删掉度数小于2的池塘,输出池塘数为奇数的连通块的池塘容量之和. 思路:两个dfs模拟就行了 # ...

  3. hdu 6200 mustedge mustedge(并查集+树状数组 或者 LCT 缩点)

    hdu 6200 mustedge mustedge(并查集+树状数组 或者 LCT 缩点) 题意: 给一张无向连通图,有两种操作 1 u v 加一条边(u,v) 2 u v 计算u到v路径上桥的个数 ...

  4. HDU 1811 拓扑排序 并查集

    有n个成绩,给出m个分数间的相对大小关系,问是否合法,矛盾,不完全,其中即矛盾即不完全输出矛盾的. 相对大小的关系可以看成是一个指向的条件,如此一来很容易想到拓扑模型进行拓扑排序,每次检查当前入度为0 ...

  5. HDU - 5438 Ponds(拓扑排序删点+并查集判断连通分量)

    题目: 给出一个无向图,将图中度数小于等于1的点删掉,并删掉与他相连的点,直到不能在删为止,然后判断图中的各个连通分量,如果这个连通分量里边的点的个数是奇数,就把这些点的权值求和. 思路: 先用拓扑排 ...

  6. hdu 1198 Farm Irrigation(深搜dfs || 并查集)

    转载请注明出处:viewmode=contents">http://blog.csdn.net/u012860063?viewmode=contents 题目链接:http://acm ...

  7. HDU 6370 dfs+并查集

    Werewolf Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 262144/262144 K (Java/Others)Total ...

  8. Hdu 5458 Stability (LCA + 并查集 + 树状数组 + 缩点)

    题目链接: Hdu 5458 Stability 题目描述: 给出一个还有环和重边的图G,对图G有两种操作: 1 u v, 删除u与v之间的一天边 (保证这个边一定存在) 2 u v, 查询u到v的路 ...

  9. HDU 5441 离线处理 + 并查集

    题意:给n个节点m条带权值边的无向图.然后q个问题,每次询问点对的数目,点对需要满足的条件是:1)连通:2)其路径的最大权值不能超过询问值. 分析:如果没次询问一次,dfs一次,很可能超时,因此可以用 ...

随机推荐

  1. jquery 获取和设置 select下拉框的值(转手册)

    ##实例应用中遇到的问题 //在某事件响应的应用中设置select选中项,前两种情况的设置不生效,使用了最后一种用法才生效的 //$("#select_time").find(&q ...

  2. erl0010 - erlang查看ets 当前系统使用情况和当前配置上限

    1.限制:erlang官网给出了ets的默认上限:“The default is 1400, can be changed with the environment variable ERL_MAX_ ...

  3. Oracle Exadata体系笔记

    Exadata一开始是以一个存储系统形式诞生的,叫做SAGE(Storage Appliance for Grid Environ ments,网格环境存储设备)   Exadata原本设计用来解决超 ...

  4. Amarino例程无法使用的问题

    Serial.begin(9600); 而不是用它的57600

  5. Bootstrap学习之路(3)---列表组件

    列表是几乎所有网站都会用到的一个组件,正好bootstrap也给我们提供了这个组件的样式,下面我给大家简单介绍一下bootstrap中的列表组件的用法! 首先,重提一下引用bootstrap的核心文件 ...

  6. [Everyday Mathematics]20150304

    证明: $$\bex \frac{2}{\pi}\int_0^\infty \frac{1-\cos 1\cos \lm-\lm \sin 1\sin \lm}{1-\lm^2}\cos \lm x\ ...

  7. 书签(Bookmarks)

    工作台允许使用者在文件中创建书签,通过这些书签,使用者可以从书签视图里快速打开这些文件,并跳转到相应的行. (1)在编辑器左边灰色的区域里单击鼠标右键,在弹出的菜单里选择“Add Bookmark.. ...

  8. 前端架构:Angular与requirejs集成实践

    这几天angular与requirejs.browserify的集成弄的博主头好晕,今天终于成功集成了requirejs,现写些心得体会在这里. 核心思想:angular加载时有一定的顺序,必须依次加 ...

  9. Python 时间整理

    在平常的代码中,我们常常需要与时间打交道.在Python中,与时间处理有关的模块就包括:time,datetime以及calendar.这篇文章,主要讲解time模块. 在开始之前,首先要说明这几点: ...

  10. 黑马程序员——OC的内存管理学习小结

    内存管理在Objective-C中的重要性就像指针在C语言中的重要程序一样. 虽然作为一门高级语言,但OC却没有内存回收机制.这就需要开发者来对动态内存进行管理.OC中内存管理的范围是:任何继承了NS ...