先scc缩点,变成DAG,显然ans=入度为0的scc个数,每个scc的答案就是scc内点权最小的值。

 1 #include<bits/stdc++.h>
 2 #define INF 0x7fffffff
 3 using namespace std;
 4 const int MAXN = 2010;//点数
 5 const int MAXM = 2100;//边数
 6 struct Edge {
 7     int to,next;
 8 }edge[MAXM];
 9 int head[MAXN],tot,a,b;
10 int Low[MAXN],DFN[MAXN],Stack[MAXN],Belong[MAXN];//Belong数组的值是1~scc
11 int Index,top; int scc;//强连通分量的个数
12 int in[MAXN],out[MAXN],val[MAXN],d[MAXN];
13 bool Instack[MAXN];
14 int num[MAXN];//各个强连通分量包含点的个数,数组编号1~scc //num数组不一定需要,结合实际情况
15 int cnt=0,ans=0;
16 void addedge(int u,int v){
17     edge[tot].to = v;
18     edge[tot].next = head[u];
19     head[u] = tot++;
20 }
21 void Tarjan(int u){
22     int v;
23     Low[u] = DFN[u] = ++Index;
24     Stack[top++] = u;
25     Instack[u] = true;
26     for(int i = head[u];i != -1;i = edge[i].next) {
27         v = edge[i].to;
28         if( !DFN[v] ){
29             Tarjan(v);
30             if( Low[u] > Low[v] )
31                 Low[u] = Low[v];
32         }
33         else if(Instack[v] && Low[u] > DFN[v])
34             Low[u] = DFN[v];
35         }
36         if(Low[u] == DFN[u]){
37             scc++;
38             do{
39                 v = Stack[--top];
40                 Instack[v] = false;
41                 Belong[v] = scc;
42                 num[scc]++;
43             }while( v != u);
44         }
45 }
46 void find_degree(int u){
47     int v;
48     for(int i = head[u];i != -1;i = edge[i].next){
49         v = edge[i].to;
50         if(Belong[u]==Belong[v]) continue;
51         in[Belong[v]]++;
52         //out[Belong[u]]++;
53     }
54 }
55 void solve(int N){
56     memset(DFN,0,sizeof(DFN));
57     memset(Instack,false,sizeof(Instack));
58     memset(num,0,sizeof(num));
59     Index = scc = top = 0;
60     for(int i=1;i<=N;i++) val[i]=INF;
61     for(int i = 1;i <= N;i++)
62         if(!DFN[i])
63         Tarjan(i);
64     for(int i=1;i<=N;i++){
65         val[Belong[i]]=min(val[Belong[i]],d[i]);
66         find_degree(i);
67     }
68     for(int i=1;i<=scc;i++){
69         if(in[i]==0) cnt++,ans+=val[i];
70     }
71 }
72 void init(){
73     tot = 0;
74     cnt=0,ans=0;
75     memset(head,-1,sizeof(head));
76     memset(in,0,sizeof(in));
77     memset(out,0,sizeof(out));
78 }
79 int main(){
80     int n,m,u,v,T;
81     while(scanf("%d%d",&n,&m)!=EOF){
82         init();
83         for(int i=1;i<=n;i++) scanf("%d",&d[i]);
84         for(int i=1;i<=m;i++){
85             scanf("%d%d",&u,&v);
86             addedge(u,v);
87         }
88         solve(n);
89         cout<<cnt<<' '<<ans<<endl;
90     }
91     return 0;
92 }

转载于:https://www.cnblogs.com/poler/p/7389110.html

HDU 1827 Summer Holiday 图论scc相关推荐

  1. hdu - 1827 Summer Holiday (强连通)

    http://acm.hdu.edu.cn/showproblem.php?pid=1827 缩点后,统计入度为0的点有多少个,那么这些点都是需要被通知的,但是这些点可能也是被缩的,所以每次在这个点所 ...

  2. HDU - 1827 Summer Holiday (强连通)

    <题目链接> 题目大意: 听说lcy帮大家预定了新马泰7日游,Wiskey真是高兴的夜不能寐啊,他想着得快点把这消息告诉大家,虽然他手上有所有人的联系方式,但是一个一个联系过去实在太耗时间 ...

  3. HDU 1827:Summer Holiday(强连通)

    http://acm.hdu.edu.cn/showproblem.php?pid=1827 思路:强连通分量缩点后找入度为0的点,然后对于属于该强连通分量的找一个最小耗费的入口. 1 #includ ...

  4. 图论 SCC(CCF高速公路)

    简介 首先需要复习一下图论的一系列知识,理解有向图的强连通分量的定义,求解有向图的强连通分量算法有很多,例如Kosaraju,Gabow和Tarjan算法,其中Gabow和Tarjan算法时间复杂度要 ...

  5. HDU 3934 Summer holiday(凸包内接最大三角形)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3934 题意:给出n个点,从中找出三个点使得面积最大. 思路:旋转卡壳模板题:首先求凸包,在旋转求最大面 ...

  6. 图论--SCC缩点--Tarjan

    // Tarjan算法求有向图强连通分量并缩点 /*强连通缩点与双连通缩点大同小异,也就是说将强连通分支缩成一个点之后,没有强连通,成为有向无环图,在对图进行题目的操作.*/ #include< ...

  7. 图论--SCC强连通缩点--Tarjan

    强连通缩点与双连通缩点大同小异,也就是说将强连通分支缩成一个点之后,没有强连通,成为有向无环图,在对图进行题目的操作. // Tarjan算法求有向图强连通分量并缩点 #include<iost ...

  8. 【转载】图论 500题——主要为hdu/poj/zoj

    转自--http://blog.csdn.net/qwe20060514/article/details/8112550 =============================以下是最小生成树+并 ...

  9. 一系列图论问题[转]

    =============================以下是最小生成树+并查集====================================== [HDU] 1213 How Many ...

最新文章

  1. Python Logging模块实现运行的程序写入 日志
  2. 主成分分析(PCA) Java
  3. 同一台电脑上使用两个 github 账号
  4. 深入浅出在NIO技术中,如何理解直接缓冲区要比非直接缓冲区效率高?
  5. Black Salt Audio All Plug-Ins Mac 实用音频压缩插件套装
  6. MarkDown编辑器实用语法、数学公式汇总
  7. 航测无人机测绘地理信息免费资料
  8. Qt界面程序嵌入另一个Qt界面程序[Linux]
  9. 谷歌邮箱SMTP小白教程
  10. android的sd卡分区,AndroidSD卡做磁盘分区图文教程
  11. java中成员变量和局部变量的区别
  12. linux查看硬盘插槽_SSD小讲堂丨自己动手丰衣足食 手把手教你安装M.2固态硬盘
  13. CVPR2019目标检测
  14. 分享一个简单、便宜配置https安全证书的方法(10元/年)
  15. android netd守护进程机制 --- netd分析
  16. 初识机器阅读理解(Machine Reading Comprehension)
  17. 嘴对嘴教你如何建立一个支持ctf动态独立靶机的靶场
  18. 访问者模式 Visitor
  19. 关于编程语言和编程工具
  20. mysql创建零件供应商表_● 建立一个供应商、零件数据库。其中“供应商”表 S(Sno,Sname,Zip,City)分别表示: 供应商代码、 供应 - 赏学吧...

热门文章

  1. C++:mutable关键字
  2. 1052. Linked List Sorting
  3. 如何解决Error: failed PB timebomb check
  4. 浅谈嵌入式系统的持续集成
  5. android mapping.txt,Android根据mapping.txt还原混淆的代码
  6. (93)Verilog HDL系统函数和任务:$fread
  7. (20)Verilog HDL并行块:fork-join
  8. linux清除硬盘,linux下清除硬盘的几种方法
  9. 3. GD32F103C8T6 GPIO的位带操作
  10. STN32F103系列IO脚引脚分布