UVa247 - Calling Circles
2013-10-25 20:27
260 查看
#include <cstdio> #include <iostream> #include <fstream> #include <string> #include <map> #include <cstring> #include <vector> #include <stack> #include <algorithm> using namespace std; const int N = 30; map<string, int> strMap; map<int, string> intMap; int idx(string &s); int f ; int dfn , low ; int dfsclock; stack<int> s; int n, m; bool inStack ; void Tarjan(int u); int main() { string s1, s2; int t = 1; #ifndef ONLINE_JUDGE //freopen("d:\\OJ\\uva_in.txt", "r", stdin); ifstream cin("d:\\OJ\\uva_in.txt"); #endif while (cin >> n >> m) { if (n == 0 && m == 0) break; memset(f, 0x00, sizeof(f)); strMap.clear(); intMap.clear(); while (m--) { cin >> s1 >> s2; int u = idx(s1), v = idx(s2); f[u][v] = 1; } memset(dfn, 0x00, sizeof(dfn)); memset(low, 0x00, sizeof(low)); memset(inStack, false, sizeof(inStack)); while (!s.empty()) s.pop(); dfsclock = 0; if (t > 1) cout << endl; cout << "Calling circles for data set " << t++ << ":" << endl; for (int i = 0; i < n; i++) { if (!dfn[i]) Tarjan(i); } } return 0; } int idx(string &s) { if (strMap.count(s)) return strMap[s]; int size = strMap.size(); strMap[s] = size; intMap[size] = s; return size; } void Tarjan(int u) { dfn[u] = low[u] = ++dfsclock; s.push(u); inStack[u] = true; for (int v = 0; v < n; v++) { if (f[u][v] && !dfn[v]) { Tarjan(v); low[u] = min(low[u], low[v]); } else if (f[u][v] && inStack[v]) { low[u] = min(low[u], dfn[v]); } } if (dfn[u] == low[u]) { vector<int> intVec; while (!s.empty()) { int v = s.top(); s.pop(); inStack[v] = false; intVec.push_back(v); if (v == u) break; } for (size_t i = 0; i < intVec.size(); i++) { if (i) cout << ", "; cout << intMap[intVec[i]]; } cout << endl; } }
相关文章推荐
- 网络基础的基础
- activitygroup里被管理的所有activity的onactivityresult失效问题
- java数据库连接(一)
- trap与INT问题
- 【日常】ICS的lab7攻略和最近生活的吐槽
- 设计模式
- 流行的一些技术术语
- 合并两个单链表练习,多项式合并
- mysql基于mysqlslap的压力测试
- 好累啊
- Linux shell脚本
- POJ 1144 - Network 用tarjan求无向图的割点
- iOS开发个人独立博客收集
- 练习1-20:请编写程序detab,将输入中的制表符替换成适当数目的空格,适空格充满到下一个制表符中止的地方。假设制表符终止位的位置是固定的,比如每隔n列就会出现一个制表符终止位。n应该作为变量还是符号常量呢?
- 文本切换器(TextSwitcher)的功能和用法
- vmware虚拟机工具vmware tools介绍及安装排错
- struts2 中chain、redirect、redirectaction的区别
- 如何在word中使代码高亮
- 静态类 内部 用法 作用
- nginx常用配置项位置参数宏说明