题意:给出一张无向图,每个节点有各自的权值,问在点数为奇数的圈中的点的权值总和是多少。

通过拓扑序的做法标记出所有非圈上的点,做法就是加每条边的时候将两点的入度都加一,然后将所有度数为1的点入队,删去它的所有边,即对没条边连的点度数减一,度数减为1继续入队,直到队列为空,入过队列的点都进行标记,表示该点不在圈上,那么剩余没有标记的点一定要么在圈上、要么是单点或自环。这时候只要对于每个没有访问过的节点,DFS遍历它的连通区域,记录点数和权值和,如果点数为奇数,则统计权值和。但是注意如果只有一个点,不能算作一个圈,所以除了判断点数是否奇数,还需要判断点数大于1。

  1. #include<stdio.h>
  2. #include<string.h>
  3. #include<algorithm>
  4. #include<math.h>
  5. #include<queue>
  6. #include<iostream>
  7. typedef long long ll;
  8. using namespace std;
  9.  
  10. const int maxn=;
  11. const int maxm=;
  12.  
  13. int head[maxn],point[maxm],nxt[maxm],id[maxn],size,vis[maxn];
  14. int v[maxn];
  15. int n,m;
  16.  
  17. void init(){
  18. memset(head,-,sizeof(head));
  19. size=;
  20. memset(id,,sizeof(id));
  21. memset(vis,,sizeof(vis));
  22. }
  23.  
  24. void add(int a,int b){
  25. point[size]=b;
  26. nxt[size]=head[a];
  27. head[a]=size++;
  28. id[b]++;
  29. point[size]=a;
  30. nxt[size]=head[b];
  31. head[b]=size++;
  32. id[a]++;
  33. }
  34.  
  35. void topo(){
  36. queue<int>q;
  37. for(int i=;i<=n;++i)if(id[i]==){
  38. id[i]=-;
  39. q.push(i);
  40. }
  41. while(!q.empty()){
  42. int u=q.front();
  43. q.pop();
  44. for(int i=head[u];~i;i=nxt[i]){
  45. int j=point[i];
  46. id[j]--;
  47. if(id[j]==){
  48. id[j]=-;
  49. q.push(j);
  50. }
  51. }
  52. }
  53. }
  54.  
  55. int nnum=;
  56. ll sum=;
  57.  
  58. void dfs(int s){
  59. vis[s]=;
  60. nnum++;
  61. sum+=v[s];
  62. for(int i=head[s];~i;i=nxt[i]){
  63. int j=point[i];
  64. if(!vis[j]&&id[j]>)dfs(j);
  65. }
  66. }
  67.  
  68. int main(){
  69. int T;
  70. scanf("%d",&T);
  71. while(T--){
  72. scanf("%d%d",&n,&m);
  73. init();
  74. for(int i=;i<=n;++i)scanf("%d",&v[i]);
  75. while(m--){
  76. int a,b;
  77. scanf("%d%d",&a,&b);
  78. add(a,b);
  79. }
  80. topo();
  81. ll ans=;
  82. for(int i=;i<=n;++i){
  83. if(!vis[i]&&id[i]>){
  84. sum=;
  85. nnum=;
  86. dfs(i);
  87. if(nnum%&&nnum>)ans+=sum;
  88. }
  89. }
  90. cout<<ans<<endl;
  91. }
  92. return ;
  93. }

hdu5438(2015长春赛区网络赛1002)拓扑序+DFS的更多相关文章

  1. hdu5443(2015长春赛区网络赛1007)暴力

    题意:给了一个数列,有多个询问,每个询问求某个区间内的最大值 数列长度 1000,询问个数 1000,静态,并不需要RMQ这些,直接暴力 n2 查找每个询问区间取最大值就行了. #include< ...

  2. hdu5442(2015长春赛区网络赛1006)后缀数组+KMP /最小表示法?

    题意:给定一个由小写字母组成的长度为 n 的字符串,首尾相连,可以从任意一个字符开始,顺时针或逆时针取这个串(长度为 n),求一个字典序最大的字符串的开始字符位置和顺时针或逆时针.如果有多个字典序最大 ...

  3. hdu5441(2015长春赛区网络赛1005)类最小生成树、并查集

    题意:有一张无向图,一些点之间有有权边,某条路径的值等于路径上所有边的边权的最大值,而某个点对的值为这两点间所有路径的值的最小值,给出多个询问,每个询问有一个值,询问有多少点对满足其值小于等于询问值. ...

  4. 2015 ACM-ICPC国际大学生程序设计竞赛北京赛区网络赛 1002 Mission Impossible 6

    题目链接: #1228 : Mission Impossible 6 解题思路: 认真读题,细心模拟,注意细节,就没有什么咯!写这个题解就是想记录一下rope的用法,以后忘记方便复习. rope(块状 ...

  5. hdu 4274 2012长春赛区网络赛 树形dp ***

    设定每个节点的上限和下限,之后向上更新,判断是否出现矛盾 #include<cstdio> #include<iostream> #include<algorithm&g ...

  6. hdu 4277 2012长春赛区网络赛 dfs+hashmap ***

    hashmap判重大法好 #include<cstdio> #include<iostream> #include<algorithm> #include<c ...

  7. hdu 4273 2012长春赛区网络赛 三维凸包中心到最近面距离 ***

    新模板 /* HDU 4273 Rescue 给一个三维凸包,求重心到表面的最短距离 模板题:三维凸包+多边形重心+点面距离 */ #include<stdio.h> #include&l ...

  8. hdu 4272 2012长春赛区网络赛 dfs暴力 ***

    总是T,以为要剪枝,后来发现加个map就行了 #include<cstdio> #include<iostream> #include<algorithm> #in ...

  9. Largest Point (2015沈阳赛区网络赛水题)

    Problem Description Given the sequence A with n integers t1,t2,⋯,tn. Given the integral coefficients ...

随机推荐

  1. Android VersionedGestureDetector手势事件

    今天研究了一下PhotoView,发现里面的自定义的手势事件可以支持所有的SDK版本,该事件可以实现拖拽.滑动.缩放功能.下面直接上代码: public abstract class Versione ...

  2. 《day18_String练习_基本类型包装类_集合入门》

    package cn.itcast.api.String.test; public class StringTest_1 { public static void main(String[] args ...

  3. lightoj1080 线段树

    //Accepted 6628 KB 520 ms //I a b 把a到b区间的二进制位去反,转化成a到b区间的数全部加1 //Q a 判断第a位的奇偶 #include <cstdio> ...

  4. JS 验证一组input框是否为空的方法

    function checkInput() { var $tr = $("#tb_confirmed .scrollContent").find("tr"); ...

  5. (转)Sqlite中INTEGER PRIMARY KEY AUTOINCREMENT和rowid的使用

    原文:http://www.cnblogs.com/peida/archive/2008/11/29/1343832.html Sqlite中INTEGER PRIMARY KEY AUTOINCRE ...

  6. 破解 CrackMe#1 [UBC] by bRaINbuSY

    系统 : Windows xp 程序 : CrackMe#1 程序下载地址 :http://pan.baidu.com/s/1nuagj6h 要求 : 编写注册机 使用工具 :IDA & OD ...

  7. HDU 2291

    http://acm.hdu.edu.cn/showproblem.php?pid=2291 读题读的烦死了,今天果真不适合做题 题意:给两个n*n的矩阵,第一个代表一个人战胜一个人可以得到的经验值, ...

  8. js千分位的函数

    不错的js千分位函数,适用于将金额每3位用“,”分隔 /*for price using thousands separator */ function fprice(s,n){ s = parseF ...

  9. Core Java Volume I — 3.5. Operators

    3.5. OperatorsThe usual arithmetic operators +, -, *, / are used in Java for addition, subtraction, ...

  10. Think Python - Chapter 18 - Inheritance

    In this chapter I present classes to represent playing cards, decks of cards, and poker hands.If you ...