~~~题面~~~

题解:

差分约束学得实在是太烂了,,,,QAQ

这里先记下:

a - b >= x  ---> a >= b + x     ---->        b ---> a = x(b连a,边权为x),      ----> 找最长路, --->f[a][b]对应a - b的最小值,

a - b <=x ---->后面的都反过来就好了

关于这道题:

首先我们可以发现它实际上就是告诉了我们一堆这样的关系:

a > b,

a < b,

a = b,

所以我们应该要想到差分约束,

如果直接连,我们发现连边权都没有,,,,

因此我们要对式子进行转化,

以a > b为例:

a > b ----> a - b > 0 ---> a - b >= 1 ---> a >= b + 1,

这就变成了形如上面的式子,

但是我们发现我们得到了a - b 的最大值和最小值还不够,

于是我们对目标进行转化,

题目要求a + b  ? x + y,其中a + b给定,

那么小于的情况实际上就是a - x < y - b || a - y < x - b,

如果是大于,那直接换符号即可,

如果是等于还要判断a - x的最大最小值相等,因为要确定的结果才能被计入答案,

 #include<bits/stdc++.h>
using namespace std;
#define R register int
#define AC 52
/*考虑差分约束中路的长度的意义。
n很小,所以考虑floyd*/
int n,a,b,ans1,ans2,ans3;
int f_min[AC][AC], f_max[AC][AC];
char c[AC]; inline void upmin(int &a,int b)
{
if(b < a) a = b;
} inline void upmax(int &a,int b)
{
if(b > a) a = b;
} inline void pre()
{
scanf("%d%d%d",&n,&a,&b);
memset(f_min,,sizeof(f_min));
for(R i=;i<=n;i++)
{
scanf("%s",c+);
for(R j=;j<=n;j++)
{
if(c[j] == '=' || i == j)
f_min[i][j] = f_max[i][j] = ;
else if(c[j] == '+')
f_min[i][j] = , f_max[i][j] = ;//s[i] - s[j] <= 2, s[i] - s[j] >= 1(最大是3 - 1 = 2)
else if(c[j] == '-')
f_min[i][j] = -, f_max[i][j] = -;//s[i] - s[j] <= -1, s[i] - s[j] >= -2
else
f_min[i][j] = , f_max[i][j] = -;//s[i] - s[j] <= 2, i - j >= -2
}
} }
#define f_min f_min
#define f_max f_max
void floyd()
{
/*for(R k=1;k<=n;k++)
for(R i=1;i<=n;i++)
{
if(i == k) continue;//防止自己做中转
for(R j=1;j<=n;j++)
{
if(i == j) continue;//自己到自己是没有用的
upmin(f_min[i][j], f_min[i][k] + f_min[k][j]);
upmax(f_max[i][j], f_max[i][k] + f_max[k][j]);
}
}*/
for(int k=;k<=n;k++) //Floyd
for(int i=;i<=n;i++)
{
if(i==k) continue;
for(int j=;j<=n;j++)
{
if(i==j) continue;
f_min[i][j]=min(f_min[i][j],f_min[i][k]+f_min[k][j]);//上界求最短路
f_max[i][j]=max(f_max[i][k]+f_max[k][j],f_max[i][j]);//下界求最长路
}
}
} void work()
{//error!!!额。。。最长路对应最小值,最短路对应最大值
/*for(R i=1;i<=n;i++)
{
for(R j=1;j<=n;j++)
printf("%d ",f_min[i][j]);
printf("\n");
}
printf("\n");
for(R i=1;i<=n;i++)
{
for(R j=1;j<=n;j++)
printf("%d ",f_max[i][j]);
printf("\n");
}*/
for(R i = ; i <= n; i++)//强行枚举每一种可能
{
if(i == a || i == b) continue;//不能选已经选定了的
for(R j = ; j < i; j++)//<i防止重复统计
{
if(j == a || j == b) continue;//同上
if(f_min[a][i] < f_max[j][b] || f_min[a][j] < f_max[i][b]) ++ans3;
if(f_max[a][i] > f_min[j][b] || f_max[a][j] > f_min[i][b]) ++ans1;
if(f_max[a][i] == f_min[a][i] && f_max[j][b] == f_min[j][b] && f_max[a][i] == f_max[j][b]) ++ans2;
else if(f_min[a][j] == f_max[a][j] && f_min[i][b] == f_max[i][b] && f_min[a][j] == f_min[i][b]) ++ans2;
}
}
printf("%d %d %d\n",ans1,ans2,ans3);
} int main()
{
freopen("in.in","r",stdin);
pre();
floyd();
work();
fclose(stdin);
return ;
}

[SCOI2008]天平 差分约束的更多相关文章

  1. 洛谷2474 [SCOI2008] 天平 差分约束->枚举

    题目描述 你有n个砝码,均为1克,2克或者3克.你并不清楚每个砝码的重量,但你知道其中一些砝码重量的大小关系.你把其中两个砝码A 和B 放在天平的左边,需要另外选出两个砝码放在天平的右边.问:有多少种 ...

  2. [luogu2474 SCOI2008]天平(floyd差分约束)

    传送门 Solution 由于重量只有三种情况,那么想到用差分约束. 由于范围比较小,想到可以floyed求差分约束,暴力求天平另一边 Code #include <cstdio> #in ...

  3. 【洛谷】2474:[SCOI2008]天平【差分约束系统】

    P2474 [SCOI2008]天平 题目背景 2008四川NOI省选 题目描述 你有n个砝码,均为1克,2克或者3克.你并不清楚每个砝码的重量,但你知道其中一些砝码重量的大小关系.你把其中两个砝码A ...

  4. 2021.07.23 P2474 天平(差分约束)

    2021.07.23 P2474 天平(差分约束) [P2474 SCOI2008]天平 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 题意: 已知A,B和每两个点点权,求点权i, ...

  5. 【BZOJ1077】天平(差分约束)

    [BZOJ1077]天平(差分约束) 题面 BZOJ 洛谷 题解 利用矩阵可以很容易得到两个点之间的最大差和最小差,再利用这个信息判断即可.差分约束用\(Floyd\)计算.时间复杂度\(O(n^3) ...

  6. 洛谷P2474 [SCOI2008]天平

    P2474 [SCOI2008]天平 题目背景 2008四川NOI省选 题目描述 你有n个砝码,均为1克,2克或者3克.你并不清楚每个砝码的重量,但你知道其中一些砝码重量的大小关系.你把其中两个砝码A ...

  7. [SCOI2008]天平

    题目描述 你有n个砝码,均为1克,2克或者3克.你并不清楚每个砝码的重量,但你知道其中一些砝码重量的大小关系.你把其中两个砝码A 和B 放在天平的左边,需要另外选出两个砝码放在天平的右边.问:有多少种 ...

  8. Candies-POJ3159差分约束

    Time Limit: 1500MS Memory Limit: 131072K Description During the kindergarten days, flymouse was the ...

  9. poj3159 差分约束 spfa

    //Accepted 2692 KB 1282 ms //差分约束 -->最短路 //TLE到死,加了输入挂,手写queue #include <cstdio> #include & ...

随机推荐

  1. ubuntu16安装过程中的硬盘分区

    硬盘分区主要是三个区,如下图,分别是/,swap交换空间,/home,其中第一个分区/是主分区,建议至少8GB,要不ubuntu安装的时候放不下.

  2. 阅读笔记《JavaScript高级程序设计》

    0. 严格模式 "user strict" (1整个脚本顶部,2函数体顶部) 1. 数据类型 undefined -- 未定义 boolean string number obje ...

  3. 使用keytool工具产生带根CA和二级CA的用户证书

    使用keytool工具产生带根CA和二级CA的用户证书 1 生成根CA 1.1 生成根CA证书   根CA实际是一张自签CA,自签CA的使用者和颁发者都是它自己.使用下面的命令生成根证书,如果没有指定 ...

  4. 初学Direct X(9) ——文字的显示

    初学Direct X(9) --文字的显示 本次学习如何使用ID3DXFont创建字体,使得我们可以在任何安装了Windows系统中TrueType字体来打印文字,不过最好使用标准字体,这样文字在每一 ...

  5. TW实习日记:第17天

    今天又改了一堆bug,比如界面的显示bug,Html字符串的处理.优化了一些交互界面,处理了一个模块数据传输的问题.我发现这些bug真的有一半是粗心导致的,真的真的是,写代码一定要细心细心再细心,不然 ...

  6. 关于java中“使用了未经检查或不安全的操作、有关详细信息,请使用 ——Xlint:unchecked重新编译”

    今天看<算法 第4版>排序章节时,发现了一个了一个小问题.先贴一下代码: public class Selection{ public static void main(String[]a ...

  7. 【第一章】Shell 概述

    一.什么是Shell? shell是一个命令解释器,它不仅包含大量的命令以实现操作系统的对话,还可以实现定义变量.条件判断.循环控制.函数调用等功能. 作用:解释执行用户输入的命令及程序等. 从键盘输 ...

  8. Python3实现机器学习经典算法(四)C4.5决策树

    一.C4.5决策树概述 C4.5决策树是ID3决策树的改进算法,它解决了ID3决策树无法处理连续型数据的问题以及ID3决策树在使用信息增益划分数据集的时候倾向于选择属性分支更多的属性的问题.它的大部分 ...

  9. var,let,const,三种申明变量的整理

    javascript,正在慢慢变成一个工业级语言,势力慢慢渗透ios,安卓,后台 首先let,是局部变量,块级作用域:var全局的,const是常量,也就是只读的: 一行demo说明 for (var ...

  10. android仿美团客户端购买框悬浮特效

        实现步骤如下: 1,新建一个项目,新建一个MyScrollView继承自ScrollView   public class MyScrollView extends ScrollView { ...