您的位置:首页 > 其它

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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: