UVALive 4431 Fruit Weights --floyd,差分约束?
题意: 给出一些关系用aX <= bY表示, 最后查询aX 和 bY的关系,是>=,==,<=,还是不能确定,还是出现了矛盾。
解法:对每一个关系其实都可以建一条X->Y的边,边权为b/a,表示X <= b/a*Y,输入完后,跑一遍floyd,对每一对点A,B跑出A<=xB的x的最小值。
因为如果真的存b/a的话,可能会损失很大的精度,但是好像这样也能过。为了更加保险,我们可以取个对数,log(b/a) = log(b)-log(a),那么乘法就变成了加法,更好计算,也更加准确。
最后就是判断了,设最后查询的是k1,k2两个点,比率为ka,kb
1.==: 如果mp[k1][k2] == -mp[k2][k1], 即是倒数关系(对数是负数关系),且mp[k1][k2] = log(kb/ka),那么就相等。
2.<=: 如果mp[k1][k2] <= log(kb/ka), 现在k1已经小于等于mp[k1][k2]了,那么肯定是小于等于log(kb/ka)的。
3.>=: -mp[k2][k1] >= log(kb/ka)
4.INCONSISTENT: 如果某个mp[i][i]为负,说明有矛盾。
5.其他情况
代码:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <cmath>
#include <algorithm>
#include <string>
#include <map>
#define Mod 1000000007
#define eps 1e-8
using namespace std; double mp[][];
map<string,int> ms; int sgn(double x) {
if(x > eps) return ;
if(x < -eps) return -;
return ;
} int main()
{
int n,i,j,a,b,tot,u,v,k;
string S;
while(scanf("%d",&n)!=EOF && n)
{
tot = ;
ms.clear();
for(i=;i<=*n;i++) {
for(j=;j<=*n;j++)
mp[i][j] = Mod;
mp[i][i] = 0.0;
}
for(i=;i<=n;i++) {
scanf("%d",&a);
cin>>S;
if(!ms[S]) ms[S] = ++tot;
u = ms[S];
scanf("%d",&b);
cin>>S;
if(!ms[S]) ms[S] = ++tot;
v = ms[S];
mp[u][v] = min(mp[u][v],log((double)b/(double)a));
}
for(k=;k<=tot;k++) {
for(i=;i<=tot;i++) {
for(j=;j<=tot;j++)
mp[i][j] = min(mp[i][j],mp[i][k]+mp[k][j]);
}
}
string S1,S2;
scanf("%d",&a);
cin>>S1;
int k1 = ms[S1];
scanf("%d",&b);
cin>>S2;
int k2 = ms[S2];
double rate = log((double)b/(double)a);
if(ms[S1] == || ms[S2] == ) { puts("UNAVAILABLE"); continue; }
for(i=;i<=tot;i++) if(sgn(mp[i][i]) < ) { puts("INCONSISTENT"); break; }
if(i != tot+) continue;
if(sgn(mp[k1][k2]+mp[k2][k1]) == && sgn(mp[k1][k2]-rate) == ) puts("==");
else if(sgn(mp[k1][k2]-rate) <= ) puts("<=");
else if(sgn(-mp[k2][k1]-rate) >= ) puts(">=");
else puts("UNAVAILABLE");
}
return ;
}
UVALive 4431 Fruit Weights --floyd,差分约束?的更多相关文章
- [luogu2474 SCOI2008]天平(floyd差分约束)
传送门 Solution 由于重量只有三种情况,那么想到用差分约束. 由于范围比较小,想到可以floyed求差分约束,暴力求天平另一边 Code #include <cstdio> #in ...
- bzoj 2788 [Poi2012]Festival 差分约束+tarjan+floyd
题目大意 有n个正整数X1,X2,...,Xn,再给出m1+m2个限制条件,限制分为两类: 1.给出a,b (1<=a,b<=n),要求满足Xa + 1 = Xb 2.给出c,d (1&l ...
- UVALive - 4885 Task 差分约束
Task 题目连接: https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&page ...
- 【拓扑排序或差分约束】Guess UVALive - 4255
题目链接:https://cn.vjudge.net/contest/209473#problem/B 题目大意:对于n个数字,给出sum[j]-sum[i](sum表示前缀和)的符号(正负零),求一 ...
- 【转】最短路&差分约束题集
转自:http://blog.csdn.net/shahdza/article/details/7779273 最短路 [HDU] 1548 A strange lift基础最短路(或bfs)★254 ...
- BZOJ_2788_[Poi2012]Festival_差分约束+tarjan+floyed
BZOJ_2788_[Poi2012]Festival_差分约束+tarjan+floyed Description 有n个正整数X1,X2,...,Xn,再给出m1+m2个限制条件,限制分为两类: ...
- 【题解】 [POI2012]FES-Festival (差分约束)
懒得复制题面,戳我戳我 Question: (因为网上找不到好的翻译,这里简单复述一下) 告诉你\(m1+m2\)个约束条件,然后要你找出\(X_1-X_n\)这些数字,求满足要求的数列中不同的数字个 ...
- 【BZOJ1077】天平(差分约束)
[BZOJ1077]天平(差分约束) 题面 BZOJ 洛谷 题解 利用矩阵可以很容易得到两个点之间的最大差和最小差,再利用这个信息判断即可.差分约束用\(Floyd\)计算.时间复杂度\(O(n^3) ...
- [SCOI2008]天平 差分约束
---题面--- 题解: 差分约束学得实在是太烂了,,,,QAQ 这里先记下: a - b >= x ---> a >= b + x ----> b - ...
随机推荐
- Java实现时间动态显示方法汇总
这篇文章主要介绍了Java实现时间动态显示方法汇总,很实用的功能,需要的朋友可以参考下 本文所述实例可以实现Java在界面上动态的显示时间.具体实现方法汇总如下: 1.方法一 用TimerTask: ...
- MessageBox的常用方法
一 函数原型及参数 function MessageBox(hWnd: HWND; Text, Caption: PChar; Type: Word): Integer; hWnd:对话框父窗口句柄, ...
- php怎么获取input输入框中的值去数据库比较显示出来
前端: <!--商品查询--> <input type="text" name="bianhao" value="" ma ...
- jquery css属性练习
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- [moka同学笔记]WINDOWS中cmd的切换目录cd命令失效
症状: 解决办法: 二.解决问题 原因是没有切换盘符步骤一:C:\Users\Administrator>D:步骤二:D:\>
- UDS(ISO14229-2006) 汉译(No.6 应用层服务)
6.1总览 应用层服务通常被当作诊断服务.应用层服务用于在基于客户端-服务器的系统(Client-Server base System)中执行一些功能,例如针对车载服务器(ECU)的检测.检查.监控和 ...
- 【JAVA并发编程实战】4、CountDownLatch
这是一个计数锁,说白了,就是当你上锁的时候,只有计数减少到0的时候,才会释放锁 package cn.xf.cp.ch05; public class TaskRunable implements R ...
- Three.js 入门指南(核心对象)
推荐大家可以看看这个:http://wenku.baidu.com/link?url=RQU2exzV_EF3GATc3bzQU2o9LGMuCmiN5nUJth5SLG3E2TrxtBLQodJU_ ...
- android重复的文件复制APK META-INF许可证错误记录
* What went wrong:Execution failed for task ':app:transformResourcesWithMergeJavaResForDebug'.> c ...
- 隐藏tabbar的属性hidesBottomBarWhenPushed
项目中有需求是A视图控制器push之后B视图控制器需要隐藏底部的tabbar,在pop之后A视图控制器仍然显示tabbar. 其实不需要在push操作时敲 self.hidesBottomBarWhe ...