HDU 2767Proving Equivalences 强连通分量
来源:互联网 发布:2017网络视听大会 编辑:程序博客网 时间:2024/05/16 08:24
题目:http://acm.hdu.edu.cn/showproblem.php?pid=2767
题意:题目描述很繁杂,大概意思就是求最少加几条边可以使图只有一个强连通分量。
思路:用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[N], low[N], scc[N], st[N], head[N];int index, cnt, top, num;bool vis[N];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[N], indeg[N]; 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;}
0 0
- hdu 2767 Proving Equivalences(强连通分量)
- HDU 2767 Proving Equivalences(强连通分量)
- HDU 2767 Proving Equivalences(强连通分量)
- HDU 2767Proving Equivalences 强连通分量
- hdu 2767 Proving Equivalences 等价性证明 强连通分量
- HDU 2767 Proving Equivalences(强连通分量)
- hdu 2767Proving Equivalences(强连通分量压缩 )
- HDU 2767 Proving Equivalences(强连通分量)
- HDU-2767 Proving Equivalences (强连通分量[Tarjan])
- hdu 2767 Proving Equivalences(强连通分量+缩点)
- [HDU 2767]Proving Equivalences(强连通分量)
- hdu 2767 Proving Equivalences(强连通分量+缩点)
- hdu 2767 Proving Equivalences 强连通
- HDU 2767 Proving Equivalences 强连通
- HDU 2767:Proving Equivalences【强连通】
- hdu2767 Proving Equivalences[强连通分量]
- La 4287 Proving Equivalences (强连通分量)
- LA 4287 Proving Equivalences / 强连通分量
- 径向基函数
- poj 1584(凸包+点在凸多边形内+圆在凸多边形内)
- python import模块出错
- SNS进阶
- SSH框架的搭建
- HDU 2767Proving Equivalences 强连通分量
- 数据库
- require和import的区别
- Android开发:报错Index -1 requested, with a size of 1
- Android drawable微技巧,你所不知道的drawable的那些细节
- 充值画面——金额的选择和输入
- 转行程序员4 机器学习 Regularization 纯属敦促自己学习
- 19、JavaBean、MVC
- centos 6.5环境利用iscsi搭建SAN网络存储服务及服务端target和客户端initiator配置详解