UVa 872 - Ordering
2016-12-06 22:05
253 查看
题目:给定一些字符和他们之间的大小关系,给出所有可能的序列。
分析:搜索。将大小关系记录到矩阵中,然后求解矩阵的闭包,拓扑排序输出。
说明:注意gets的头文件。
#include <iostream>
#include <cstdlib>
#include <cstring>
#include <cstdio>
#include <cmath>
int appare[26];
int maps[26][26];
int closure()
{
for (int k = 0; k < 26; ++ k) {
for (int i = 0; i < 26; ++ i) {
for (int j = 0; j < 26; ++ j) {
if (maps[i][k] && maps[k][j]) {
maps[i][j] = 1;
if (maps[j][i] == 1) {
return 0;
}
}
}
}
}
return 1;
}
char ans[26];
int indegree[26];
void dfs(int d, int n)
{
if (d == n) {
printf("%c",ans[0]);
for (int i = 1; i < n; ++ i) {
printf(" %c",ans[i]);
}
puts("");
}else {
for (int i = 0; i < 26; ++ i) {
if (appare[i] && !indegree[i]) {
for (int j = 0; j < 26; ++ j) {
if (maps[i][j]) {
indegree[j] --;
}
}
appare[i] = 0;
ans[d] = i+'A';
dfs(d+1, n);
appare[i] = 1;
for (int j = 0; j < 26; ++ j) {
if (maps[i][j]) {
indegree[j] ++;
}
}
}
}
}
}
int main()
{
int n;
char buf[303];
scanf("%d",&n);
getchar();
while (n --) {
getchar();
gets(buf);
memset(appare, 0, sizeof(appare));
int variable_size = 0;
for (int i = 0; buf[i]; ++ i) {
if (buf[i] != ' ' && !appare[buf[i]-'A']) {
appare[buf[i]-'A'] = 1;
variable_size ++;
}
}
gets(buf);
int index = 0;
for (int i = 0; buf[i]; ++ i) {
if (buf[i] != ' ') {
buf[index ++] = buf[i];
}
}
memset(maps, 0, sizeof(maps));
int flag = 0;
for (int i = 0; i < index; i += 3) {
if (maps[buf[i+2]-'A'][buf[i]-'A']) {
flag = 1;
break;
}else {
maps[buf[i]-'A'][buf[i+2]-'A'] = 1;
}
}
if (flag || !closure()) {
puts("NO");
}else {
for (int i = 0; i < 26; ++ i) {
for (int j = 0; j < 26; ++ j) {
if (appare[i] && appare[j] && maps[i][j]) {
indegree[j] ++;
}
}
}
dfs(0, variable_size);
}
if (n) {
puts("");
}
}
return 0;
}
分析:搜索。将大小关系记录到矩阵中,然后求解矩阵的闭包,拓扑排序输出。
说明:注意gets的头文件。
#include <iostream>
#include <cstdlib>
#include <cstring>
#include <cstdio>
#include <cmath>
int appare[26];
int maps[26][26];
int closure()
{
for (int k = 0; k < 26; ++ k) {
for (int i = 0; i < 26; ++ i) {
for (int j = 0; j < 26; ++ j) {
if (maps[i][k] && maps[k][j]) {
maps[i][j] = 1;
if (maps[j][i] == 1) {
return 0;
}
}
}
}
}
return 1;
}
char ans[26];
int indegree[26];
void dfs(int d, int n)
{
if (d == n) {
printf("%c",ans[0]);
for (int i = 1; i < n; ++ i) {
printf(" %c",ans[i]);
}
puts("");
}else {
for (int i = 0; i < 26; ++ i) {
if (appare[i] && !indegree[i]) {
for (int j = 0; j < 26; ++ j) {
if (maps[i][j]) {
indegree[j] --;
}
}
appare[i] = 0;
ans[d] = i+'A';
dfs(d+1, n);
appare[i] = 1;
for (int j = 0; j < 26; ++ j) {
if (maps[i][j]) {
indegree[j] ++;
}
}
}
}
}
}
int main()
{
int n;
char buf[303];
scanf("%d",&n);
getchar();
while (n --) {
getchar();
gets(buf);
memset(appare, 0, sizeof(appare));
int variable_size = 0;
for (int i = 0; buf[i]; ++ i) {
if (buf[i] != ' ' && !appare[buf[i]-'A']) {
appare[buf[i]-'A'] = 1;
variable_size ++;
}
}
gets(buf);
int index = 0;
for (int i = 0; buf[i]; ++ i) {
if (buf[i] != ' ') {
buf[index ++] = buf[i];
}
}
memset(maps, 0, sizeof(maps));
int flag = 0;
for (int i = 0; i < index; i += 3) {
if (maps[buf[i+2]-'A'][buf[i]-'A']) {
flag = 1;
break;
}else {
maps[buf[i]-'A'][buf[i+2]-'A'] = 1;
}
}
if (flag || !closure()) {
puts("NO");
}else {
for (int i = 0; i < 26; ++ i) {
for (int j = 0; j < 26; ++ j) {
if (appare[i] && appare[j] && maps[i][j]) {
indegree[j] ++;
}
}
}
dfs(0, variable_size);
}
if (n) {
puts("");
}
}
return 0;
}
相关文章推荐
- UVa 872 - Ordering 输出全拓扑排序
- UVa 872 Ordering(拓扑排序输出全部路径)
- UVa 872 - Ordering 输出全拓扑排序
- Uva872-Ordering
- UVa872 - Ordering(拓扑排序)
- UVALive 6832 Bit String Reordering (模拟)
- UVa 10305 (拓扑排序) Ordering Tasks
- UVaLive 6832 Bit String Reordering (模拟)
- Ordering Tasks - UVa 10305 拓扑排序
- Ordering Tasks UVA - 10305
- UVA Ordering Tasks
- Ordering Tasks UVA - 10305
- Uvalive 6832 Bit String Reordering
- 贪心 UVALive 6832 Bit String Reordering
- UVALive 6832 Bit String Reordering
- UvaLive 6435 Network Packet Ordering(dp)
- UVALive - 6832 Bit String Reordering (找规律)
- Bit String Reordering UVALive - 6832
- Ordering Tasks UVA - 10305 图的拓扑排序
- ACM篇:Uva 10305----Ordering Tasks.cpp