题意:给一个有向图,选最少的点(同时最小价值),从这些点出发可以遍历所有。

思路:先有向图缩点,成有向树,找入度为0的点即可。

下面给出有向图缩点方法:

用一个数组SCC记录即可,重新编号,1....num,具体方法如下代码详见。

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<vector>
  4. #include<stack>
  5. using namespace std;
  6. int n,m;
  7. vector<vector<int> >v(10010);
  8. int vis[10010];int dfn[10010];int low[10010];int times=0;
  9. int num=0;
  10. int instack[10010];stack<int>s; //有向图的连通性,用栈。
  11. int scc[1010]; int w[1010]; int neww[1010];
  12. int ind[1010];
  13. void tarjarn(int u)
  14. {
  15. dfn[u]=low[u]=++times;
  16. instack[u]=1;
  17. s.push(u);
  18. for(int i=0;i<v[u].size();i++)
  19. {
  20. int vv=v[u][i];
  21. if(!vis[vv])
  22. {
  23. vis[vv]=1;
  24. tarjarn(vv);
  25. if(low[vv]<low[u])low[u]=low[vv]; //孩子可以到达,我必然也可以到达。
  26. }
  27. else if(instack[vv]) //注意,更新时要有在栈中条件,代表该孩子(其实是祖先)我能到达,而且是属于当前SCC。
  28. {
  29. if(dfn[vv]<low[u])low[u]=dfn[vv]; //能到达的祖先,所以更新。
  30. }
  31. }
  32. if(dfn[u]==low[u])
  33. {
  34. num++;int cur;
  35. int min=w[u]; //找这个SCC权最小的权。
  36. do
  37. {
  38. cur=s.top();
  39. if(w[cur]<min)min=w[cur];
  40. s.pop();
  41. instack[cur]=0;
  42. scc[cur]=num;
  43. }while(cur!=u);
  44. neww[num]=min;
  45. }
  46. }
  47. int main()
  48. {
  49. while(~scanf("%d %d",&n,&m))
  50. {
  51. int ta,tb;
  52. for(int i=0;i<=n;i++)
  53. {
  54. v[i].clear();
  55. neww[i]=ind[i]=w[i]=instack[i]=dfn[i]=low[i]=vis[i]=0;
  56. }
  57. times=0;
  58. for(int i=1;i<=n;i++)
  59. {
  60. scanf("%d",&w[i]);
  61. }
  62. for(int i=0;i<m;i++)
  63. {
  64. scanf("%d %d",&ta,&tb);
  65. v[ta].push_back(tb);
  66. }
  67. num=0;
  68. for(int i=1;i<=n;i++)
  69. {
  70. if(!vis[i])
  71. { vis[i]=1;
  72. tarjarn(i);
  73. }
  74. }
  75. int sum=0;int count=0;
  76. for(int i=1;i<=n;i++) //遍历边。
  77. {
  78. for(int j=0;j<v[i].size();j++)
  79. {
  80. if(scc[i]!=scc[v[i][j]])
  81. {
  82. ind[scc[v[i][j]]]++;
  83. }
  84. }
  85. }
  86. for(int i=1;i<=num;i++)
  87. {
  88. if(ind[i]==0)
  89. {
  90. sum+=neww[i];
  91. count++;
  92. }
  93. }
  94. printf("%d %d\n",count, sum);
  95. }
  96. return 0;
  97. }

hdu 1827 有向图缩点看度数的更多相关文章

  1. poj 1236+hdu2767 有向图 缩点+看度数(tarjan)

    1236题意:一个有向图,1,求至少从几个点出发可以遍历该图,2:,求至少添加多少边,使强连通.而,HDU的只有后面一问. 解;先缩点,第一问只需找所有入度为0的点即可.,第2问,max(入度为0的点 ...

  2. hdu 3072 有向图缩点成最小树形图计算最小权

    题意,从0点出发,遍历所有点,遍历边时候要付出代价,在一个SCC中的边不要付费.求最小费用. 有向图缩点(无需建立新图,,n<=50000,建则超时),遍历边,若不在一个SCC中,用一个数组更新 ...

  3. hdu 3639 有向图缩点+建反向图+搜索

    题意:给个有向图,每个人可以投票(可以投很多人,一次一票),但是一个人只能支持一人一次,支持可以传递,自己支持自己不算,被投支持最多的人. 开始想到缩点,然后搜索,问题是有一点想错了!以为支持按票数计 ...

  4. HDU 1827 强连通 缩点 Summer Holiday

    求出强连通分量,因为强连通中只要有一个人被通知到了,所有人都能被通知到. 缩点以后形成一个DAG,找出那些入度为0的点,累加上它们的权值就是答案.一个点的权值等于SCC中权值最小的那个点. #incl ...

  5. HDU 4635 (完全图 和 有向图缩点)

    题目链接:HDU  4635 题目大意: 给你一个有向图,加有向边,使得这个图是简单有向图.问你最多加多少条有向边. 简单有向图: 1.不存在有向重边. 2.不存在图循环.(注意是不存在 “图” 循环 ...

  6. Tarjan系列算法总结(hdu 1827,4612,4587,4005)

    tarjan一直是我看了头大的问题,省选之前还是得好好系统的学习一下.我按照不同的算法在hdu上选题练习了一下,至少还是有了初步的认识.tarjan嘛,就是维护一个dfsnum[]和一个low[],在 ...

  7. HDU 1827 Summer Holiday(强连通)

    HDU 1827 Summer Holiday 题目链接 题意:中文题 思路:强连通缩点,每一个点的权值为强连通中最小值,然后入度为0的点就是答案 代码: #include <cstdio> ...

  8. HDU1269(有向图缩点模板题)

    迷宫城堡 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submis ...

  9. POJ2553( 有向图缩点)

    The Bottom of a Graph Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: 9779   Accepted:  ...

随机推荐

  1. python基础一 day13 生成器

    #生成器函数# def generator():# print(1)# return 'a'## ret = generator()# print(ret) #只要含有yield关键字的函数都是生成器 ...

  2. Asp.Net Core 入门(十)—— 模型绑定和验证

    模型绑定时将Http请求中的数据映射到控制器操作方法上对应的参数,操作方法中的参数可以是简单类型,如整形,字符串等,也可以是复杂类型,如Product,Order等. Asp.Net Core MVC ...

  3. 获得stixel的gt数据

    这是论文中的作者博客地址https://sites.google.com/site/danmlevi/ 这是作者现在的博客地址https://sites.google.com/view/danlevi ...

  4. Python IDE推荐

    八个最佳Python IDE 作者:chszs,转载需注明.博客主页:http://blog.csdn.net/chszs Python是一种功能强大.语言简洁的编程语言.本文向大家推荐8个适合pyt ...

  5. jQuery-AJAX简介

    AJAX是浏览器后台与服务器交换数据的技术,无须加载整个页面的情况下,对页面中的局部进行更新. AJAX=异步的JavaScript与XML(Asynchronous JavaScript and X ...

  6. 不安装oracle客户端用sqlplus连接数据库

    在不安装oracle客户端情况下用sqlplus连接数据库: 1.去官网下载 http://www.oracle.com/technetwork/topics/winx64soft-089540.ht ...

  7. STATIC 和 CLASS

    STATIC 和 CLASS 由 王巍 (@ONEVCAT) 发布于 2015/01/28 Swift 中表示 “类型范围作用域” 这一概念有两个不同的关键字,它们分别是 static 和 class ...

  8. JS任意文件转base64

    <!doctype html><html><head><meta charset="utf-8"><meta name=&qu ...

  9. Ubuntu 16.04如何使用无线网卡上网

    我使用的无线网卡卡托型号是华为E8372h,网卡是普通电信卡(既可以打电话也可以上网). 按照“芯片朝上.缺口朝外.用最大卡”的方法将网卡装入卡托后,紧接着便将卡托插入笔记本对应的USB接口中. 在这 ...

  10. JSTL 配置

    pache Tomcat安装JSTL 库步骤如下: 从Apache的标准标签库中下载的二进包(jakarta-taglibs-standard-current.zip). 官方下载地址:http:// ...