Codeforces 510C
来源:互联网 发布:淘宝注册收不到验证码 编辑:程序博客网 时间:2024/04/29 21:10
拓扑排序模板题,本身没什么好说的,但是刘汝佳在白书中用到一个技巧,就是一个数组可以表示结点的三种状态:0代表未被访问过,1代表已经访问过,-1代表正在访问。
#include <iostream>#include <string.h>using namespace std;int c[30], gra[30][30];int topo[30], cnt;int dfs(int u){ c[u] = -1; //设为负值,第3种状态 for(int v = 1; v <= 26; v++) if(gra[u][v]){ if(c[v] < 0) return 0; //环路 else if(!c[v] && !dfs(v)) return 0; } c[u] = 1; topo[--cnt] = u; return 1;}int toposort(){ cnt = 27; memset(c, 0, sizeof(c)); for(int u = 1; u <= 26; u++) if(!c[u]) if(!dfs(u)) return 0; return 1;}int main(){ int n; cin >> n; char s[105][105]; for(int i = 1; i <= n; i++) cin >> s[i]; memset(gra, 0, sizeof(gra)); int flag = 1; for(int i = 1 ;i <= n - 1; i++){ for(int j = 0; s[i][j] != '\0' || s[i + 1][j] != '\0'; j++){ if(s[i][j] == '\0') break; if(s[i + 1][j] == '\0'){ flag = 0; goto judge; } if(s[i][j] == s[i + 1][j]) continue; else{ int a = s[i][j] - 'a' + 1, b = s[i + 1][j] - 'a' + 1; gra[a][b] = 1; break; } } } judge:if(!flag) cout << "Impossible" << endl; else{ if(!toposort()) cout << "Impossible" << endl; else{ for(int i = 1; i <= 26; i++) cout << (char)(topo[i] + 'a' - 1); } } return 0;}
用好这种技巧,很多搜索问题都可以得到解决,代码也会更加简洁。
0 0
- Codeforces 510C
- 【codeforces 510 C】
- codeforces 510c 拓扑排序
- codeforces--510C--Fox And Names
- Codeforces 510C - Fox And Names
- Fox And Names - CodeForces 510 C
- codeforces 510C Fox And Names 拓扑
- codeforces-510C-Fox And Names【DFS】
- CodeForces 510C Fox And Names
- CodeForces 510C (拓扑排序)
- CodeForces - 510C Fox And Names
- CodeForces - 510C(拓扑排序)
- [拓扑] Codeforces #510C. Fox And Names
- Codeforces-340-C(c++)
- Codeforces-507-C(c++)
- CodeForces 731C C
- CodeForces-612C C
- CODEFORCES 265C CODEFORCES, 265C
- MIPI DSI协议介绍
- Linux IKE daemon “pluto”
- Winx64下OpenGL附加库(glew,glut)安装时遇到的几个注意点
- 机房收费系统之用户需求分析
- jQuery.extend 函数详解
- Codeforces 510C
- TO_TIMESTAMP数据库SQL时间转换
- leetcode_56_Merge Intervals
- Effective C++读书笔记(条款24-29)
- Objective-C 学习资料汇总 -- 2015/02/11
- 什么是vs 程序的manifest文件
- VB.NET与VB6.0的区别
- 网络编程之UDP编程
- 注册宝第五期beta2插件模块下载及说明