HDU 1827 Summer Holiday 图论scc
先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相关推荐
- hdu - 1827 Summer Holiday (强连通)
http://acm.hdu.edu.cn/showproblem.php?pid=1827 缩点后,统计入度为0的点有多少个,那么这些点都是需要被通知的,但是这些点可能也是被缩的,所以每次在这个点所 ...
- HDU - 1827 Summer Holiday (强连通)
<题目链接> 题目大意: 听说lcy帮大家预定了新马泰7日游,Wiskey真是高兴的夜不能寐啊,他想着得快点把这消息告诉大家,虽然他手上有所有人的联系方式,但是一个一个联系过去实在太耗时间 ...
- HDU 1827:Summer Holiday(强连通)
http://acm.hdu.edu.cn/showproblem.php?pid=1827 思路:强连通分量缩点后找入度为0的点,然后对于属于该强连通分量的找一个最小耗费的入口. 1 #includ ...
- 图论 SCC(CCF高速公路)
简介 首先需要复习一下图论的一系列知识,理解有向图的强连通分量的定义,求解有向图的强连通分量算法有很多,例如Kosaraju,Gabow和Tarjan算法,其中Gabow和Tarjan算法时间复杂度要 ...
- HDU 3934 Summer holiday(凸包内接最大三角形)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3934 题意:给出n个点,从中找出三个点使得面积最大. 思路:旋转卡壳模板题:首先求凸包,在旋转求最大面 ...
- 图论--SCC缩点--Tarjan
// Tarjan算法求有向图强连通分量并缩点 /*强连通缩点与双连通缩点大同小异,也就是说将强连通分支缩成一个点之后,没有强连通,成为有向无环图,在对图进行题目的操作.*/ #include< ...
- 图论--SCC强连通缩点--Tarjan
强连通缩点与双连通缩点大同小异,也就是说将强连通分支缩成一个点之后,没有强连通,成为有向无环图,在对图进行题目的操作. // Tarjan算法求有向图强连通分量并缩点 #include<iost ...
- 【转载】图论 500题——主要为hdu/poj/zoj
转自--http://blog.csdn.net/qwe20060514/article/details/8112550 =============================以下是最小生成树+并 ...
- 一系列图论问题[转]
=============================以下是最小生成树+并查集====================================== [HDU] 1213 How Many ...
最新文章
- Python Logging模块实现运行的程序写入 日志
- 主成分分析(PCA) Java
- 同一台电脑上使用两个 github 账号
- 深入浅出在NIO技术中,如何理解直接缓冲区要比非直接缓冲区效率高?
- Black Salt Audio All Plug-Ins Mac 实用音频压缩插件套装
- MarkDown编辑器实用语法、数学公式汇总
- 航测无人机测绘地理信息免费资料
- Qt界面程序嵌入另一个Qt界面程序[Linux]
- 谷歌邮箱SMTP小白教程
- android的sd卡分区,AndroidSD卡做磁盘分区图文教程
- java中成员变量和局部变量的区别
- linux查看硬盘插槽_SSD小讲堂丨自己动手丰衣足食 手把手教你安装M.2固态硬盘
- CVPR2019目标检测
- 分享一个简单、便宜配置https安全证书的方法(10元/年)
- android netd守护进程机制 --- netd分析
- 初识机器阅读理解(Machine Reading Comprehension)
- 嘴对嘴教你如何建立一个支持ctf动态独立靶机的靶场
- 访问者模式 Visitor
- 关于编程语言和编程工具
- mysql创建零件供应商表_● 建立一个供应商、零件数据库。其中“供应商”表 S(Sno,Sname,Zip,City)分别表示: 供应商代码、 供应 - 赏学吧...
热门文章
- C++:mutable关键字
- 1052. Linked List Sorting
- 如何解决Error: failed PB timebomb check
- 浅谈嵌入式系统的持续集成
- android mapping.txt,Android根据mapping.txt还原混淆的代码
- (93)Verilog HDL系统函数和任务:$fread
- (20)Verilog HDL并行块:fork-join
- linux清除硬盘,linux下清除硬盘的几种方法
- 3. GD32F103C8T6 GPIO的位带操作
- STN32F103系列IO脚引脚分布