差分约束什么的不会,所以只能暴力解决了
具体思路是如果i<j,就找大于j的,假如是k吧,那么就有i<k;反之亦然
//2625748 2011-08-13 16:24:21 Accepted 1589 C++ 30 184 ylwh@Unknown
//2625741 2011-08-13 16:22:26 Wrong Answer 1589 C++ 30 184 ylwh@Unknown
//2625729 2011-08-13 16:19:30 Wrong Answer 1589 C++ 20 184 ylwh@Unknown
#include <stdio.h>
#define N 27
struct node
{
int staue, relation;
}map[N][N];
int main()
{
int ii, i, j, k, m ,n, p;
char ch1, ch2, ch3;
scanf("%d", &n);
for(ii=1; ii<=n; ii++)
{
for(i=1; i<=26; i++)//错误的将i<=26写成i<26
for(j=1; j<=26; j++)
{
map[i][j].staue = 1;/*所有没有在输入给出的关系都为1*/
map[i][j].relation = 0;/*没有关系就是0. 小于-1,大于1 */
}
scanf("%d", &m);
for(i=1; i<=m; i++)
{
scanf(" %c %c %c", &ch1, &ch2, &ch3);
j= ch1 - 'A' + 1;
k = ch3 - 'A' + 1;
if(ch2 == '<')
{
map[j][k].relation = -1;
map[k][j].relation = 1;
}
else if(ch2 == '>')
{
map[k][j].relation = -1;
map[j][k].relation = 1;
}
map[k][j].staue = map[j][k].staue = 0;
}
for(p=1; p<=26; p++)
for(i=1; i<26; i++)
for(j=1; j<=26; j++)
if(map[i][j].relation == 1)
{
for(k=1; k<=26; k++)
if(map[j][k].relation == 1)// .....X.....
{
map[i][k].relation = 1;
map[k][i].relation = -1;
}
}
else if(map[i][j].relation == -1)//这里刚开始时可能也错了,else前未加大括号,可能使else并到X处。
{
for(k=1; k<=26; k++)
if(map[j][k].relation == -1)
{
map[i][k].relation = -1;
map[k][i].relation = 1;
}
}
int ok = 0;
printf("Case %d:\n", ii);
for(i=1; i<=26; i++)
for(j=1; j<=26; j++)
if(map[i][j].staue && map[i][j].relation == -1)
{
ok = 1;
printf("%c<%c\n", i+'A'-1, j+'A'-1);
}
if( !ok )
printf("NONE\n");
}
return 0;
}
ZOJ 1589 Professor John【暴力解决】【待改进】
最新推荐文章于 2014-08-15 18:17:17 发布