THE MATRIX PROBLEM

Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)

Total Submission(s): 7819    Accepted Submission(s): 2019

Problem Description
You have been given a matrix CN*M, each element E of CN*M is positive and no more than 1000, The problem is that if there exist N numbers a1, a2, … an and M numbers b1, b2, …, bm, which satisfies that each elements
in row-i multiplied with ai and each elements in column-j divided by bj, after this operation every element in this matrix is between L and U, L indicates the lowerbound and U indicates the upperbound of these elements.
 
Input
There are several test cases. You should process to the end of file.

Each case includes two parts, in part 1, there are four integers in one line, N,M,L,U, indicating the matrix has N rows and M columns, L is the lowerbound and U is the upperbound (1<=N、M<=400,1<=L<=U<=10000). In part 2, there are N lines, each line includes
M integers, and they are the elements of the matrix.


 
Output
If there is a solution print "YES", else print "NO".
 
Sample Input
3 3 1 6
2 3 4
8 2 6
5 2 9
 
Sample Output
YES
 
Source
 
Recommend
lcy   |   We have carefully selected several similar problems for you:  3665 3669 3667 3664 3663 

刚开始用差分约束写的,我去,超时到最后!!!!后来找优化算法,slf跟lll都还没看,看到了深搜的SPFA

差分约束代码,别人提交的就能过,我的就超时,搞不懂,这一定不会是人品问题,对的,一定不会是!!!!!

超时代码:(应该是oj编译器问题或者就是AC的标准提高了)
#include<cstdio>
#include<iostream>
#include<cstring>
#include<queue>
#include<cmath>
#include<algorithm>
using namespace std;
#define MAXN 1000
#define MAXM 500000+10
#define INF 0x3f3f3f
int dis[MAXN],vis[MAXN],used[MAXN],m,n;
int head[MAXN],cnt;
double map[MAXN][MAXN];
double L,U;
struct node
{
int u,v;
double val;
int next;
}edge[MAXM];
void init()
{
memset(head,-1,sizeof(head));
memset(map,0,sizeof(map));
cnt=0;
}
void add(int u,int v,int val)
{
node E={u,v,val,head[u]};
edge[cnt]=E;
head[u]=cnt++;
}
void getmap()
{
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
scanf("%lf",&map[i][j]);
add(j+n,i,log(U/map[i][j]));
add(i,j+n,-log(L/map[i][j]));
}
}
for(int i=1;i<=n+m;i++)
add(0,i,0);
}
void SPFA()
{
memset(vis,0,sizeof(vis));
memset(used,0,sizeof(used));
memset(dis,INF,sizeof(dis));
queue<int>q;
q.push(0);
dis[0]=0;
used[0]++;
vis[0]=1;
while(!q.empty())
{
int u=q.front();
q.pop();
vis[u]=0;
for(int i=head[u];i!=-1;i=edge[i].next)
{
node E=edge[i];
if(dis[E.v]>dis[E.u]+E.val)
{
dis[E.v]=dis[E.u]+E.val;
if(!vis[E.v])
{
vis[E.v]=1;
used[E.v]++;
if(used[E.v]>(int)sqrt(1.0*n+m))
{
cout<<"NO"<<endl;
return ;
}
q.push(E.v);
}
}
}
}
cout<<"YES"<<endl;
}
int main()
{
while(scanf("%d%d%lf%lf",&n,&m,&L,&U)!=EOF)
{
init();
getmap();
SPFA();
}
return 0;
}

SPFA深搜版


#include<iostream>
#include<cstdio>
#include<string.h>
#include<algorithm>
#include<math.h>
#include<stack>
#include<queue>
using namespace std;
const int MAX=805;
struct node
{
int v,next;
double c;
}g[MAX*MAX];
int adj[MAX];
int n,m,e;
double dis[MAX],l,u;
bool vis[MAX],inStack[MAX];
inline void add(int u,int v,double c)
{
g[e].v=v; g[e].c=c; g[e].next=adj[u]; adj[u]=e++;
}
bool spfa(int u)
{
int i,v;
if(inStack[u])
return false;
inStack[u]=true;
vis[u]=true;
for(i=adj[u];i!=-1;i=g[i].next)
{
v=g[i].v;
if(dis[v]>dis[u]+g[i].c)
{
dis[v]=dis[u]+g[i].c;
if(!spfa(v))
{
return false;
}
}
}
inStack[u]=false;
return true;
}
bool ok()
{
int i,u,v,cnt=0;
memset(vis,0,sizeof(vis));
memset(inStack,0,sizeof(inStack));
for(i=0;i<=n+m;i++)
{
dis[i]=0;
}
for(i=1;i<=n+m;i++)
{
if(!vis[i])
{
if(!spfa(i))
{
return false;
}
}
}
return true;
}
int main()
{
int i,j;
double t;
while(scanf("%d%d %lf %lf",&n,&m,&l,&u)!=EOF)
{
e=0;
memset(adj,-1,sizeof(adj));
for(i=1;i<=n;i++)
{
for(j=1;j<=m;j++)
{
scanf("%lf",&t);
add(j+n,i,log(u/t));
add(i,j+n,-log(l/t));
}
}
if(ok())
puts("YES");
else
puts("NO");
}
return 0;
}

hdoj--3666--THE MATRIX PROBLEM(差分约束+SPFA深搜)的更多相关文章

  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. 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 ...

  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. hduTHE MATRIX PROBLEM(差分约束)

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

  6. HDOJ 1016 Prime Ring Problem素数环【深搜】

    Problem Description A ring is compose of n circles as shown in diagram. Put natural number 1, 2, -, ...

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

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

  8. 【poj3169】【差分约束+spfa】

    题目链接http://poj.org/problem?id=3169 题目大意: 一些牛按序号排成一条直线. 有两种要求,A和B距离不得超过X,还有一种是C和D距离不得少于Y,问可能的最大距离.如果没 ...

  9. O - Layout(差分约束 + spfa)

    O - Layout(差分约束 + spfa) Like everyone else, cows like to stand close to their friends when queuing f ...

随机推荐

  1. Bitcoin学习篇之---PPS和PPLNS挖矿模式介绍

    PPS和PPLNS挖矿模式介绍 比特币每10分钟产生一个区块,会有千万人竞争.而这个区块终于仅仅归1个人全部.其他人都颗粒无收. 你或许要挖5年才干获得一个区块. 组队挖矿就是.一旦队伍里不论什么人获 ...

  2. mysqli一些常用方法及详解

    mysqli一些常用方法及详解 1.die()函数:表示向用户输出引号中的内容后,程序终止运行,提示定制的出错信息 ex: $conn = mysqli_connect("localhost ...

  3. mysqli数据库操作简单实例

    mysqli数据库操作简单实例 代码 结果

  4. USACO 2.1 Sorting a Three-Valued Sequence

    Sorting a Three-Valued Sequence IOI'96 - Day 2 Sorting is one of the most frequently performed compu ...

  5. 「JavaSE 重新出发」05.01.02 hashCode 方法、toString 方法

    hashCode 方法 散列码(hash code)是由对象导出的一个整形值(可以是负数).其是没有规律的,如果x与y是两个不同的对象,则x.hashCode()与y.hashCode()基本上不会相 ...

  6. 织梦Fatal error: Call to a member function GetInnerText()

    问题:织梦修改或者添加了自定义表单后在后台修改文章的时候出现如下错误:Fatal error: Call to a member function GetInnerText() on a non-ob ...

  7. UVa 11520 Fill in the Square

    题意:给出 n*n的格子,把剩下的格子填上大写字母,使得任意两个相邻的格子的字母不同,且从上到下,从左到右的字典序最小 从A到Z枚举每个格子填哪一个字母,再判断是否合法 #include<ios ...

  8. codecademy练习记录--Learn Python(70%)

    ############################################################################### codecademy python 5. ...

  9. input的radio根据value和name反向显示

    1.获取radio的值,是根据name设置一组单选框. 例如: <div id="sexBox"> <input type="radio" i ...

  10. crm 系统项目(三) 业务

    1. 项目背景 crm系统是某教育平台正在使用的项目,系统主要为 销售部.运营部.教质部门提供管理平台,随着公司规模的扩展,对公司员工的业务信息量化以及信息化建设越来越重要. crm系统为不同角色的用 ...