UVA1572
一道有向图的简单题。难的是有向图模型的提取。题目原文
核心思路就是,将正方形的每一个边看做结点,每一个正方形看成通路(边)。
输入样例:
3
A+00A+A+ 00B+D+A- B-C+00C+
1
K+K-Q+Q
输出样例:
bounded
unbounded
注意事项:
注意一下下面代码中solve
函数和dfs
函数中的逻辑关系就行,没有什么特别的。
代码:
#include <cstdio>
#include <cstring>
int g[52][52];
int c[52];
int ID(char a, char b)
{
if (b == '+') return (a - 'A') * 2;
if (b == '-') return (a - 'A') * 2 + 1;
}
void connect(char a1, char a2, char b1, char b2)
{
int u = ID(a1, a2) ^ 1;
int v = ID(b1, b2);
g[u][v] = 1;
}
//正在-1 已经1 未0
bool dfs(int n)
{
c[n] = -1;
for (int i = 0; i < 52; i++) {
if (g[n][i]) {
if (c[i] == -1) return true;
if (c[i] == 0 && dfs(i)) return true;
}
}
c[n] = 1;
return false;
}
bool solve()
{
memset(c, 0, sizeof(c));
for (int i = 0; i < 52; i++) {
if (c[i] == 0) {
if (dfs(i)) return true;
}
}
return false;
}
int main()
{
#ifdef LOCAL
freopen("in.txt", "r", stdin);
freopen("out.txt", "w", stdout);
#endif
int n;
while (scanf("%d", &n) == 1 && n)
{
memset(g, 0, sizeof(g));
while (n--) {
char s[20];
scanf("%s", s);
for (int i = 0; i < 4; i++) {
for (int j = 0; j < 4; j++) {
if (i != j && s[2*i]!='0' && s[2*j] != '0') {
connect(s[2 * i], s[2 * i + 1], s[2 * j], s[2 * j + 1]);
}
}
}
}
if (solve()) puts("unbounded");
else puts("bounded");
}
return 0;
}