hdoj--3666--THE MATRIX PROBLEM(差分约束+SPFA深搜)
THE MATRIX PROBLEM
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.
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.
3 3 1 6
2 3 4
8 2 6
5 2 9
YES
超时代码:(应该是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深搜)的更多相关文章
- HDU 3666 THE MATRIX PROBLEM (差分约束)
题意:给定一个最大400*400的矩阵,每次操作可以将某一行或某一列乘上一个数,问能否通过这样的操作使得矩阵内的每个数都在[L,R]的区间内. 析:再把题意说明白一点就是是否存在ai,bj,使得l&l ...
- HDU 3666.THE MATRIX PROBLEM 差分约束系统
THE MATRIX PROBLEM Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Other ...
- 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 ...
- 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 ...
- hduTHE MATRIX PROBLEM(差分约束)
题目请戳这里 题目大意:给一个n*m的矩阵,求是否存在这样两个序列:a1,a2...an,b1,b2,...,bm,使得矩阵的第i行乘以ai,第j列除以bj后,矩阵的每一个数都在L和U之间. 题目分析 ...
- HDOJ 1016 Prime Ring Problem素数环【深搜】
Problem Description A ring is compose of n circles as shown in diagram. Put natural number 1, 2, -, ...
- HDU 3666 THE MATRIX PROBLEM (差分约束 深搜 & 广搜)
THE MATRIX PROBLEM Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Other ...
- 【poj3169】【差分约束+spfa】
题目链接http://poj.org/problem?id=3169 题目大意: 一些牛按序号排成一条直线. 有两种要求,A和B距离不得超过X,还有一种是C和D距离不得少于Y,问可能的最大距离.如果没 ...
- O - Layout(差分约束 + spfa)
O - Layout(差分约束 + spfa) Like everyone else, cows like to stand close to their friends when queuing f ...
随机推荐
- oracle 11gR2 如何修改vip
因为业务需要,需要将p570a主机和p570b主机上的vip做修改 修改前ip 192.168.128.12 p570a-vip 192.168.128.13 p570b-vip 修改后ip ...
- 子线程中刷新了UI
This application is modifying the autolayout engine from a background thread, which can lead to engi ...
- Kafka.net使用编程入门
最近研究分布式消息队列,分享下! 首先zookeeper 和 kafka 压缩包 解压 并配置好! 我本机zookeeper环境配置如下: D:\Worksoftware\ApacheZookeep ...
- thinkphp连接数据库,会有大量的sleep连接
show processlist; 说明各列的含义和用途, id列:一个标识,你要kill 一个语句的时候很有用. user列: 显示当前用户,如果不是root,这个命令就只显示你权限范围内的sql语 ...
- Java之NoSuchMethodError
Java之NoSuchMethodError 最近生产环境出现的一个问题,NoSuchMethodError,之前遇到过,大概明白就是方法冲突.这里总结一下,以备学习之用. 错误代码如下: 2018- ...
- <错误>
1. package com.multak.cookaraclient.adapter; import android.content.Context; import android.support. ...
- Android 的永久登陆 与注销登陆
一.永久登陆 sharedprefrence 存储 userID 以及 password private String FILE = "saveUserNamePwd";//用于 ...
- ZBrush中Mrgb、Rgb和M的使用
ZBrush®软件工具架中所有的命令选项都是我们平时较为常用的,位于工具架的中间位置,有一个Mrgb.Rgb和M选项它们所表示的是材质及颜色,那么,在Zbrush中只要选择相应的选项,就可以同时绘制材 ...
- Windows10 下安装 Mongodb
一.先登录Mongodb官网https://www.mongodb.com/download-center#community 下载 安装包.32.64位的都行.
- CF859C Pie Rules 动态规划 逆推_思维题
题意:有 nnn 个物品,每个物品有不同的价值,物品按顺序分给两个人,有一块令牌,每回合拥有令牌的人拥有物品的分配权,但是该回合未获得物品的那个人会在下回合获得令牌,开始令牌在Bob手里,两个人都采取 ...