LightOJ - 1034 Hit the Light Switches(强连通)
2015-11-10 00:05
471 查看
题目大意:有N盏灯,灯满足u, v要求,表示u亮了,v也就亮了
问需要开几盏灯,才能让所有的灯都亮了
解题思路:强连通块内的灯能相互作用。求出强连通块,然后缩点连边,找出入度为0的点,入度为0的点,就是要按的灯的数量
问需要开几盏灯,才能让所有的灯都亮了
解题思路:强连通块内的灯能相互作用。求出强连通块,然后缩点连边,找出入度为0的点,入度为0的点,就是要按的灯的数量
#include <cstdio> #include <cstring> #include <algorithm> using namespace std; const int N = 10010; const int M = 100010; struct Edge{ int u, v, next; Edge() {} Edge(int u, int v, int next): u(u), v(v), next(next) {} }E[M]; int head , sccno , pre , lowlink , Stack , in ; int n, m, scc_cnt, dfs_clock, top, cas = 1; void init() { memset(head, -1, sizeof(head)); scanf("%d%d", &n, &m); int u, v; for (int i = 0; i < m; i++) { scanf("%d%d", &u, &v); E[i] = Edge(u, v, head[u]); head[u] = i; } } void dfs(int u, int fa) { lowlink[u] = pre[u] = ++dfs_clock; Stack[++top] = u; for (int i = head[u]; ~i; i = E[i].next) { int v = E[i].v; if (!pre[v]) { dfs(v, u); lowlink[u] = min(lowlink[u], lowlink[v]); } else if (!sccno[v]) { lowlink[u] = min(pre[v], lowlink[u]); } } int x; if (lowlink[u] == pre[u]) { scc_cnt++; while (1) { x = Stack[top--]; sccno[x] = scc_cnt; if (x == u) break; } } } void solve() { memset(pre, 0, sizeof(pre)); memset(sccno, 0, sizeof(sccno)); dfs_clock = top = scc_cnt = 0; for (int i = 1; i <= n; i++) { if (!pre[i]) dfs(i, -1); } for (int i = 1; i <= scc_cnt; i++) in[i] = 0; for (int i = 0; i < m; i++) { int u = sccno[E[i].u]; int v = sccno[E[i].v]; if (u == v) continue; in[v]++; } int ans = 0; for (int i = 1; i <= scc_cnt; i++) if (!in[i]) ans++; printf("Case %d: %d\n", cas++, ans); } int main() { int test; scanf("%d", &test); while (test--) { init(); solve(); } return 0; }
相关文章推荐
- Android Studio 1.4带来的福利
- Redis 代理服务Twemproxy
- iOS开发系列--通知与消息机制
- CodeProject上的两个简单绘图程序
- 项目冲刺,20151109
- 项目冲刺第六天
- Java 运行原理
- 如何写好 C main 函数
- 关于人生,有哪些让你醍醐灌顶的人生金句?
- 111
- 总结在前端排序中遇到的问题
- ADO.NET基础知识汇总
- python控制台中实现进度条功能
- Python 文件管理实例详解
- Python中对元组和列表按条件进行排序的方法示例
- Python复制文件操作实例详解
- 在PHP中使用FastCGI解析漏洞及修复方案
- 深入理解PHP内核(一)
- 深入理解PHP内核(二)之SAPI探究
- 如何使用PHP Embed SAPI实现Opcodes查看器