UVA 1572 Self-Assembly 拓扑排序
2015-08-04 10:01
375 查看
这道题就是用拓扑排序来判断是否有有向环即可。当我看了学长的代码,才发现自己写得又丑又长,为了大家的眼睛,我就贴一下TT学长的代码,其中一些小技巧大家可以学习一下0.0
// // Created by TaoSama on 2015-07-24 // Copyright (c) 2015 TaoSama. All rights reserved. // //#pragma comment(linker, "/STACK:1024000000,1024000000") #include <algorithm> #include <cctype> #include <cmath> #include <cstdio> #include <cstdlib> #include <cstring> #include <iomanip> #include <iostream> #include <map> #include <queue> #include <string> #include <set> #include <vector> using namespace std; #define pr(x) cout << #x << " = " << x << " " #define prln(x) cout << #x << " = " << x << endl const int N = 1e5 + 10, INF = 0x3f3f3f3f, MOD = 1e9 + 7; int n, c[60]; vector<int> G[60]; int get(char x1, char x2) { return 2 * (x1 - 'A') + (x2 == '+'); //二进制表示,最末一位标注正负 } //add one-way edge with rev vertex //to simulate the two vertex are bidirectional without cycle. //A+ <-> B- => A- -> B- & B+ -> A+ //once got and edge with A- & B+ that forms a cycle, but the original's not void add_edge(char* s) { for(int i = 1; i <= 8; i += 2) { for(int j = 1; j <= 8; j += 2) { if(s[i] == '0' || s[j] == '0' || i == j) continue; int u = get(s[i], s[i + 1]) ^ 1, v = get(s[j], s[j + 1]); //抑或1就代表符号取反 G[u].push_back(v); } } } bool dfs(int u) { c[u] = -1; for(int i = 0; i < G[u].size(); ++i) { int v = G[u][i]; if(c[v] < 0) return false; if(!c[v] && !dfs(v)) return false; } c[u] = 1; return true; } bool topo() { memset(c, 0, sizeof c); for(int i = 0; i < 52; ++i) { if(!c[i] && !dfs(i)) return false; } return true; } int main() { #ifdef LOCAL freopen("in.txt", "r", stdin); // freopen("out.txt","w",stdout); #endif ios_base::sync_with_stdio(0); while(cin >> n) { for(int i = 0; i < 52; ++i) G[i].clear(); for(int i = 1; i <= n; ++i) { char s[10]; cin >> (s + 1); add_edge(s); } if(topo()) cout << "bounded\n"; else cout << "unbounded\n"; } return 0; }
相关文章推荐
- 帧同步在竞技类网络游戏中的应用
- hdu 1251 统计难题(字典树)
- 由BMP位图到各种图片格式的来源
- 自己写的 读写 ini 配置文件类
- HashSet 的contains方法
- 一串英文字符中 变第一个字母为大写
- 如何在Linux下修改Mysql的用户(root)密码
- Tomcat服务器学习和使用(二)
- Error: '$' is undefined
- python基础学习小作业(一)
- 音乐治疗处方
- JavaScript中模拟实现Java的集合类Map的常用方
- VIM复制、粘贴、删除、撤销
- windows一些常用设置
- 从Theano到Lasagne:基于Python的深度学习的框架和库
- Android Studio 1.x版 签名key生成,查看key的sha1 和MD5 的方法
- [leetcode-64]Minimum Path Sum(C)
- 关于下载Spring官方包
- Mac/WIN zip压缩包乱码问题解决
- STL之traits编程技法