题意:

  给一个n*m矩阵,每个格子上有一个数字a[i][j],给定L和U,问:是否有这样两个序列{a1...an}和{b1...bn},满足 L<=a[i][j]*ai/bj<=U 。若存在输出yes,否则no。

思路:

  能够得到的是一堆不等式,那么可以用最短路来解决差分约束系统。但是a[i][j]*ai/bj<=U是除的,得提前变成减的才行。可以用对数log来解决,先不管a[i][j],logai-logbj<=U不就行了?可以得到:

  (1)logai - logbj<=U/a[i][j]       (注:这里已经是浮点型了)

  (2)logbj - logai<=-L/a[i][j]

根据这个来建图即可,值得注意的是,点是log(x),而不是x,只有n+m个点。

但是起点呢?不妨以随便以一个点r作为起点,置cost[r]=0,其他INF,来进行最短路,我们只需要对其判断是否有负环即可。

 //#include <bits/stdc++.h>
#include <cstdio>
#include <cstring>
#include <map>
#include <iostream>
#include <deque>
#include <vector>
#define INF 0x7f7f7f7f
#define pii pair<int,int>
#define LL unsigned long long
using namespace std;
const int N=;
struct node
{
int from,to;
double cost;
node(){};
node(int from,int to,double cost):from(from),to(to),cost(cost){};
}edge[N*N];
vector<int> vect[N];
int edge_cnt; void add_node(int from,int to,double cost)
{
edge[edge_cnt]=node(from,to,cost);
vect[from].push_back(edge_cnt++);
} double cost[N];
int cnt[N];
bool inq[N];
int spfa(int up)
{
memset(inq, , sizeof(inq));
memset(cost, 0x7f, sizeof(cost));
cost[]=;
deque<int> que(,);//随便以1作为起点 while(!que.empty())
{
int x=que.front();que.pop_front();
inq[x]=;
for(int i=; i<vect[x].size(); i++)
{
node e=edge[vect[x][i]];
if(cost[e.to]>cost[x]+e.cost)
{
cost[e.to]=cost[x]+e.cost;
if(!inq[e.to])
{
inq[e.to]=;
if(++cnt[e.to]>up) return false;
if(!que.empty()&&cost[e.to]<cost[que.front()])
que.push_front(e.to);//一个优化
else
que.push_back(e.to);
}
}
}
}
return true;
} int main()
{
freopen("input.txt", "r", stdin);
int n, m, a, b, c, L, U;
double g; while(~scanf("%d %d %d %d", &n, &m, &L, &U))
{
edge_cnt=;
memset(edge,,sizeof(edge));
for(int i=; i<=n+m; i++) vect[i].clear(); //a1~an编号为1~n,b1~bn编号为n+1~n+m
for(int i=; i<=n; i++)
{
for(int j=; j<=m; j++)
{
scanf("%lf",&g);
add_node(i, n+j, -L/g);
add_node(n+j, i, U/g);
}
}
if( spfa(n+m) ) puts("YES");
else puts("NO");
}
return ;
}

AC代码

HDU 3666 THE MATRIX PROBLEM (差分约束,最短路)的更多相关文章

  1. HDU 3666 THE MATRIX PROBLEM (差分约束)

    题意:给定一个最大400*400的矩阵,每次操作可以将某一行或某一列乘上一个数,问能否通过这样的操作使得矩阵内的每个数都在[L,R]的区间内. 析:再把题意说明白一点就是是否存在ai,bj,使得l&l ...

  2. HDU 3666.THE MATRIX PROBLEM 差分约束系统

    THE MATRIX PROBLEM Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Other ...

  3. HDU 3666 THE MATRIX PROBLEM (差分约束 深搜 & 广搜)

    THE MATRIX PROBLEM Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Other ...

  4. HDU3666 THE MATRIX PROBLEM (差分约束+取对数去系数)(对退出情况存疑)

    You have been given a matrix C N*M, each element E of C N*M is positive and no more than 1000, The p ...

  5. HDU3666-THE MATRIX PROBLEM(差分约束-不等式解得存在性判断 对数转化)

    You have been given a matrix C N*M, each element E of C N*M is positive and no more than 1000, The p ...

  6. hduTHE MATRIX PROBLEM(差分约束)

    题目请戳这里 题目大意:给一个n*m的矩阵,求是否存在这样两个序列:a1,a2...an,b1,b2,...,bm,使得矩阵的第i行乘以ai,第j列除以bj后,矩阵的每一个数都在L和U之间. 题目分析 ...

  7. hdu 3666 THE MATRIX PROBLEM

    差分约束系统. 根据题意,可以写出不等式 L <= (Xij * Ai) / Bj <= U 即 Ai/Bj<=U/Xij和Ai/Bj>=L/Xij 由于差分约束系统是减法.. ...

  8. hdu 1534 Schedule Problem (差分约束)

    Schedule Problem Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) ...

  9. POJ 3159 Candies(差分约束+最短路)题解

    题意:给a b c要求,b拿的比a拿的多但是不超过c,问你所有人最多差多少 思路:在最短路专题应该能看出来是差分约束,条件是b - a <= c,也就是满足b <= a + c,和spfa ...

随机推荐

  1. POJ 3181 Dollar Dayz (完全背包,大数据运算)

    题意:给出两个数,n,m,问1~m中的数组成n,有多少种方法? 这题其实就相当于 UVA 674 Coin Change,求解一样 只不过数据很大,需要用到高精度运算... 后来还看了网上别人的解法, ...

  2. iOS生成本地随机验证码

    原文链接:http://www.cnblogs.com/jerehedu/p/4527707.html 效果图:

  3. Win7 VMWare 串口通信

    下载安装工具: 1. 如果电脑(笔记本)没有串口接口,则需要使用一个 USB-Serial 转换线,这里使用 prolific usb-serial USB--串口转换线,首先需要在win7上安装对应 ...

  4. Webpack教程一

    比较 如果你熟悉原来一系列的构建工具,grunt或者gulp之类的,这里有一篇webpack和他们比较的文章可以读一读. Webpack Compared 安装 先装好node和npm,因为webpa ...

  5. 从idea到ipo

    **************************************************************************************************** ...

  6. foreach的参数不是数组:Warning: Invalid argument supplied for foreach

    Warning: Invalid argument supplied for foreach() 问题Warning: Invalid argument supplied for foreach() ...

  7. POJ 3525 Most Distant Point from the Sea (半平面交向内推进+二分半径)

    题目链接 题意 : 给你一个多边形,问你里边能够盛的下的最大的圆的半径是多少. 思路 :先二分半径r,半平面交向内推进r.模板题 #include <stdio.h> #include & ...

  8. hdu 4061 A Card Game

    思路: 分析:假设取的牌顺序是一个序列,那么这种序列在末尾为1时是和取牌序列一一对应的,且是符合“游戏结束时牌恰好被取完”的一种情况. 简证:1.在序列中,任一数 i 的后一个数 j 是必然要放在第 ...

  9. PHP:错误 Deprecated: Function split() is deprecated in ... 解决办法

    PHP:错误 Deprecated: Function split() is deprecated in ... 解决办法 PHP5.3 split() 不建议使用的原因:PHP 5.3.0 之后的r ...

  10. iOS开发--泛型

    一. 泛型函数 1.单一占位符泛型函数 下面就使用一个经典案例:两个数值进行交换.来使用泛型,写一个通用的函数,这个函数的功能就是交换两个变量的值.在Swift中不允许类型隐式转换,也就是说,如果你定 ...