~~~题面~~~

题解:

差分约束学得实在是太烂了,,,,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. jquery 点滴

    jQuery——动态给表格添加序号 $(function(){ //$('table tr:not(:first)').remove(); var len = $('table tr').length ...

  2. PHP调用wsdl接口实例化SoapClient抛出异常

    异常:Message:SOAP-ERROR: Parsing WSDL: Couldn't load from 'http://*****?wsdl' : failed to load externa ...

  3. 180713-Spring之借助Redis设计访问计数器之扩展篇

    之前写了一篇博文,简单的介绍了下如何利用Redis配合Spring搭建一个web的访问计数器,之前的内容比较初级,现在考虑对其进行扩展,新增访问者记录 记录当前站点的总访问人数(根据Ip或则设备号) ...

  4. loadrunner_遇到cookie接口_3种应对方法

    方法一:是调用登录接口,在调用登录后的接口 方法二:手动储存cookie,写死cookie 方法一:提前登录收集cookie,写成参数化文件 方法一,案例(就是先登录,再写登录后的接口): 注:use ...

  5. Appium ——Android KEYCODE键值:

    Python下语法: driver.keyevent(键值) 电话按键: 键名 描述 键值 KEYCODE_CALL 拨号键 5 KEYCODE_ENDCALL 挂机键 6 KEYCODE_HOME ...

  6. Mysql-表和字段操作

    1.查看表 show tables; 2.创建表 create table test( id int primary key auto_increment, name varchar(40) not ...

  7. openstack对接VMware浅析

    前言 本文是对openstack对接vmware的浅析,所以本文重点是以下两点: 先了解它的整体架构,搞清楚为什么要用这样的架构: 然后再了解架构中的各个组件,组件提供的主要功能与各个组件之间的交互 ...

  8. NFS服务搭建使用

    需求:由于线上业务有一些数据存在了Redis数据库和mysql数据库中了,导致了数据较大迁移起来比较麻烦,所以准备搭建NFS来做WEB的共享磁盘,存储这些数据. 服务端搭建: 查看本机关于nfs的包 ...

  9. 使用HTML5制作时钟

    之前看到别人用HTML5制作时钟,自己也写了一个,这是很久以前写的了,没有注释,现在自己看都晕了(注释的重要性就体现在这边了),找时间加上注释,让自己和别人都比较好理解. <!DOCTYPE h ...

  10. 蓝牙核心技术概述(四):蓝牙协议规范(HCI、L2CAP、SDP、RFOCMM)(转载)

    一.主机控制接口协议  HCI 蓝牙主机-主机控模型 蓝牙软件协议栈堆的数据传输过程: 1.蓝牙控制器接口数据分组:指令分组.事件分组.数据分组(1).指令分组 如:Accpet Connection ...