这是一道差分约束,差分约束的作用是你把所有存在的条件不等式写出来,然后你就可以求两个变量的最大差值或者最小差值或者判断这种最值是否存在
此题的易错点在于我们一定要把所有条件不等式都写出来否则就鸡鸡,具体见代码。
我先开始的时候只写了一部分不等式所以就错的很离谱。。。最后看了题解才明白。。。
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
int n, m, i, j, k, a, b, c1, c2, c3, x[55][55], y[55][55];
char s[55];
int main()
{
scanf("%d%d%d", &n, &a, &b);
for (int i = 1; i <= n; i++)
{
scanf("%s", s + 1);
for (int j = 1; j <= n; j++)
{
if (i == j)
continue;
x[i][j] = -2; y[i][j] = 2;
if (s[j] == '+')x[i][j] = 1;
if (s[j] == '-')y[i][j] = -1;
if (s[j] == '=')
x[i][j] = y[i][j] = 0;
}
}
for (int k = 1; k <= n; k++)
{
for (i = 1; i <= n; i++)
{
for (int j = 1; j <= n; j++)
{
if (i == j || k == i || k == j)
continue;
x[i][j] = max(x[i][j], x[i][k] + x[k][j]);
y[i][j] = min(y[i][j], y[i][k] + y[k][j]);
}
}
}
for (int i = 1; i <= n; i++)
for (int j = i + 1; j <= n; j++)
{
if (i == j || i == a || i == b || j == a || j == b)continue;
if (x[a][i] > y[j][b] || x[a][j] > y[i][b])c1++;
if (x[a][i] == y[a][i] && x[j][b] == y[j][b] && x[a][i] == x[j][b])c2++;
//else
//if (x[a][j] == y[a][j] && x[i][b] == y[i][b] && x[a][j] == x[i][b])c2++;
if (y[a][i] < x[j][b] || y[a][j] < x[i][b])c3++;
}
printf("%d %d %d\n", c1, c2, c3);
return 0;
}