关于传递闭包做此题
  • 板块P1347 排序
  • 楼主S0CRiA
  • 当前回复3
  • 已保存回复3
  • 发布时间2021/8/2 13:38
  • 上次更新2023/11/4 12:14:25
查看原帖
关于传递闭包做此题
390770
S0CRiA楼主2021/8/2 13:38

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,ji,j 使得 d[i,j]d[i,j]d[j,i]d[j,i] 均为 11,则说明题目中给出的 mm 个不等式矛盾。”可是判断矛盾必须在 floyd 过程中判断,否则会 WA。

这是为什么?

2021/8/2 13:38
加载中...