rt
代码:
//P1347
#include <bits/stdc++.h>
using namespace std;
const int N = 30;
bool Edge[N][N], D[N][N];
int n, m;
inline int floyd(){
memcpy(D, Edge, sizeof(D));
for(int k = 0; k < n; ++ k)
for(int i = 0; i < n; ++ i)
for(int j = 0; j < n; ++ j){
D[i][j] |= D[i][k] & D[k][j];
if(i != j && D[i][j] && D[j][i]) return 0;//这句话放这里AC
}
for(int i = 0; i < n; ++ i){
for(int j = 0; j < n; ++ j){
// if(i != j && D[i][j] && D[j][i]) return 0;//这句话放这里WA
if(i != j && !D[i][j] && !D[j][i]) return 1;
}
}
return 2;
}
inline void doit_just_doit(){
memset(Edge, 0, sizeof(Edge));
bool flg=true;
for(int i = 1; i <= m; ++ i){
char s[5];
scanf("%s", s);
if(s[0] == s[2]){
printf("Inconsistency found after %d relations.\n", i);
return;
}
Edge[s[0] - 'A'][s[2] - 'A'] = true;
int now=floyd();
if(now == 0){
printf("Inconsistency found after %d relations.\n", i);
return;
} else if(now == 2){
printf("Sorted sequence determined after %d relations: ", i);
pair<int, char> Ans[N];
for(int j = 0; j < n; ++ j)
Ans[j] = make_pair(0, j + 'A');
for(int j = 0; j < n; ++ j)
for(int k = 0; k < n; ++ k)
if(D[k][j]) ++ Ans[j].first;
sort(Ans, Ans + n);
for(int j = 0; j < n; ++ j)
putchar(Ans[j].second);
puts(".");
return;
}
}
puts("Sorted sequence cannot be determined.");
return;
}
int main(){
scanf("%d%d", &n, &m);
doit_just_doit();
return 0;
}
蓝书上说“传递闭包完成后,若存在变量 i,j 使得 d[i,j] 和 d[j,i] 均为 1,则说明题目中给出的 m 个不等式矛盾。”可是判断矛盾必须在 floyd 过程中判断,否则会 WA。
这是为什么?