HDU 2767 Proving Equivalences 强连通分量
2016-04-28 21:20
459 查看
题目:http://acm.hdu.edu.cn/showproblem.php?pid=2767
题意:题目描述很繁杂,大概意思就是求最少加几条边可以使图只有一个强连通分量。
思路:用tarjan算法求强连通分量缩点,统计每个点的入度和出度,最后输出入度为0和出度为0的点的个数中的较大值,至于为什么这样做,没有证明,不过可以自己实验一下
总结:跟poj某道题差不多
题意:题目描述很繁杂,大概意思就是求最少加几条边可以使图只有一个强连通分量。
思路:用tarjan算法求强连通分量缩点,统计每个点的入度和出度,最后输出入度为0和出度为0的点的个数中的较大值,至于为什么这样做,没有证明,不过可以自己实验一下
总结:跟poj某道题差不多
#include<iostream> #include<algorithm> #include<cstdio> #include<queue> #include<map> #include<vector> #include<cstring> #include<cctype> #include<cmath> using namespace std; typedef long long ll; const int N = 20100; struct edge { int to, next; } G[N*5]; int dfn , low , scc , st , head ; int index, cnt, top, num; bool vis ; int n, m; void init() { memset(head, -1, sizeof head); memset(dfn, -1, sizeof dfn); memset(vis, 0, sizeof vis); index = cnt = top = num = 0; } void add_edge(int v, int u) { G[cnt].to = u; G[cnt].next = head[v]; head[v] = cnt++; } void tarjan(int v) { dfn[v] = low[v] = index++; vis[v] = true; st[top++] = v; int u; for(int i = head[v]; i != -1; i = G[i].next) { u = G[i].to; if(dfn[u] == -1) { tarjan(u); low[v] = min(low[v], low[u]); } else if(vis[u]) low[v] = min(low[v], dfn[u]); } if(dfn[v] == low[v]) { num++; do { u = st[--top]; vis[u] = false; scc[u] = num; } while(u != v); } } void slove() { for(int i = 1; i <= n; i++) if(dfn[i] == -1) tarjan(i); if(num == 1) { printf("0\n"); return; } int outdeg , indeg ; memset(outdeg, 0, sizeof outdeg); memset(indeg, 0, sizeof indeg); for(int i = 1; i <= n; i++) for(int j = head[i]; j != -1; j = G[j].next) if(scc[i] != scc[G[j].to]) outdeg[scc[i]]++, indeg[scc[G[j].to]]++; int in0 = 0, out0 = 0; for(int i = 1; i <= num; i++) { if(outdeg[i] == 0) out0++; if(indeg[i] == 0) in0++; } printf("%d\n", max(in0, out0)); } int main() { int t, a, b; scanf("%d", &t); while(t--) { scanf("%d%d", &n, &m); init(); for(int i = 0; i < m; i++) { scanf("%d%d", &a, &b); add_edge(a, b); } slove(); } return 0; }
相关文章推荐
- iOS开发总结之UIView常用属性
- Android开发:报错Index -1 requested, with a size of 1
- iOS 自定义UIDatePicker日期选择器视图 —— HERO博客
- UIScrollView在Autolayout中的使用
- iOS学习笔记------UIButton、UIImageView、UILabel的属性与方法
- Builds failing with OutOfMemoryErrors(Heap or Permgen space) on Jenkins
- 对石家庄铁道大学网站首页进行UI分析
- 针对石家庄铁道大学官网首页的UI分析
- 对石家庄铁道大学官网UI设计的分析
- JAVA设计模式(04):创建型-建造模式(Builder)
- arm交叉编译器gnueabi、none-eabi、arm-eabi、gnueabihf、gnueabi区别
- iOS 自定义UIPickerView地区选择器视图 —— HERO博客
- UIViewContentMode 图文解说
- 共同学习Java源代码--常用工具类--AbstractStringBuilder(九)
- Android官方Training阅读笔记 ---- Building a Dynamic UI with Fragments(Building a Flexible UI) (二)
- iOS UIScrollView简介及使用技巧
- 共同学习Java源代码--常用工具类--AbstractStringBuilder(八)
- android 的activity 与IOS UIControllerView对比
- Android酷炫实用的开源框架(UI框架)
- Integer.valueOf(int i)与自动拆箱与装箱