【题】【差分约束】NKOJ 2457 矩阵问题

原创 2016年05月31日 13:26:41

NKOJ 2457 矩阵问题
时间限制 : - MS 空间限制 : 165536 KB
评测说明 : 时限:3000ms

问题描述
给出一个n*m的整数矩阵F。
求两个数列A和B,数列A有n个元素:A1,A2,A3…An 。数列B有m个元素:B1,B2,B3…..Bm,
使得对矩阵中的每个数进行下面的计算之后的结果在[X,Y]之间:
计算操作为:A[i] * F[i][j] / B[j]。

输入格式
第一行, 一个整数T(T<=5),表示有T组测试数据
对于每组测试数据:
第一行,四个整数n,m,X,Y
接下来一个n*m的矩阵,数字间以空格做间隔

输出格式
共T行,每行对应一组测试数据的结果:
若能找到满足条件的数列A和B,输出“YES”,否则输出“NO”

样例输入 1
2
3 3 1 6
2 3 4
8 2 6
5 2 9
3 5 8 9
13 12 4 7 5
10 10 13 9 13
3 15 4 5 11

样例输出 1
YES
NO

样例输入 2
2
4 7 2 4
11 10 8 15 8 1 12
8 2 2 8 13 12 2
6 10 9 7 11 10 1
5 9 9 11 7 10 9
3 10 1 11
18 8 18 14 12 6 7 17 15 12
14 3 4 17 8 1 19 4 6 1
8 20 4 7 19 19 6 15 6 16

样例输出 2
NO
YES

提示
1<=N、M<=400,1<=X<=Y<=20000
给出的矩阵中每个数字都是1000以内的正整数。

思路:
题目为关于不等式的题考虑使用差分约束。
题意 x<=a[i]*F[i][j]/b[j]<=y
移项得 x*b[j]<=a[i]*F[i][j]<=y*b[j]
该形式不满足差分约束的形式,所以(方法)两边同时取对数

则原式化为 log(x*b[j])<=log(a[i]*F[i][j])<=log(y*b[j])
log(x)+log(b[j])<=log(a[i])+log(F[i][j])<=log(y)+log(b[j])

则可得到两个不等式:
log(b[j])-log(a[i])<=log(F[i][j])-log(x)
log(a[i])-log(b[j])<=log(y)-log(F[i][j])

设dis[i]表示log(a[i])
dis[j+n]表示log(b[j])
使用差分约束,则当出现负权回路时无解

代码:

#include<iostream>
#include<cstdio>
#include<queue>
#include<cmath>
using namespace std;
const int needb=320007;
const int needd=807;
const int inf=100000000;

queue<int>q;
bool f[needd];
int tot=0,fi[needb],la[needb],en[needb],cnt[needd];
double le[needb],dis[needd];
double x,y;
int n,m;

void add_(int b,int a,double c)
{
    tot++;
    le[tot]=c;
    en[tot]=b;
    la[tot]=fi[a];
    fi[a]=tot;
}

bool spfa()
{
    int x,y,t;
    for(int i=1;i<=n+m;i++)
    {
        dis[i]=inf;
        f[i]=false;
        cnt[i]=0;
    } 
    while(q.size()) q.pop();
    q.push(1);f[1]=true;dis[1]=0,cnt[1]++;
    while(q.size())
    {
        x=q.front();f[x]=false;q.pop();
        t=fi[x];
        while(t!=0)
        {
            y=en[t];
            if(dis[x]+le[t]<dis[y])
            {
                dis[y]=dis[x]+le[t];
                if(!f[y])
                {
                    q.push(y);f[y]=true;
                    cnt[y]++;
                    if(cnt[y]>m+n) return false;
                }
            }
            t=la[t];
        }
    }
    return true;
}

int main()
{
    int t;scanf("%d",&t);
    while(t)
    {
        t--;
        scanf("%d%d%lf%lf",&n,&m,&x,&y);
        x=log(x),y=log(y);
        double a;
        for(int i=1;i<=n;i++)
         for(int j=1;j<=m;j++)
         {
            scanf("%lf",&a);
            a=log(a);
            add_(n+j,i,a-x);
            add_(i,n+j,y-a);
         }
        printf(spfa()?"YES\n":"NO\n");
        for(int i=1;i<=tot;i++)
        {
            la[i]=le[i]=en[i]=0;
        }
        for(int i=1;i<=n+m;i++) fi[i]=0;
        tot=0;
    }
} 
版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

hdu3592 差分约束问题

Description Nowadays, many people want to go to Shanghai to visit the World Exhibition. So there ...

Poj 1201 差分约束问题 详解

差分约束问题: 如果一个系统由n个变量和m个约束条件组成,其中每个约束条件形如xj-xi 求解差分约束系统,可以转化成图论的单源最短路径(或最长路径)问题。 观察xj-xi ...

【HDU5545 2015 CCPC 南阳国赛F】【差分约束思想 费用流思想】The Battle of Guandu 官渡之战 重要战场人数多 士兵流向转化问题为最短路spfa+dijkstra双写

#include #include #include #include #include #include #include #include #include #include #include #...

numba版 自适应差分进化算法 速度超快 可以求解约束问题

自适应差分进化算法 求解约束问题 速度超快

模板_poj1201Intervals_差分约束系统解决(类区间问题)

poj1201题目链接 题意: 第一行输入n,下面输入n个限制条件,条件的格式为 ai bi ci,  0 差分约数系统的含义,其实就是如果有n个变量在m个形如aj-ai>=bk(类...

Hoj 13313 Smoking gun 差分约束问题

传送门: http://acm.hnu.cn/online/?action=problem&type=show&id=13313 Smoking gun Time Li...

POJ3159差分约束最短路径问题

#include #include using namespace std; #define MAX_N 30005 #define MAX_E 150005 #define INF 1<...

POJ 1364 King(差分约束简单题 判环)

POJ 1364题目大意有n个变量a1...ana_1...a_n,有若干形如(asi+asi+1+...+asi+ni−1+asi+ni>//< k_i)的不等式,问你是否存在满足约束条件的一组解。...

poj 3159 Candies (差分约束系统裸题)

Time Limit: 1500MS Memory Limit: 131072K Total Submissions: 31698 Accepted: 8837 Descr...

[BZOJ1202][HNOI2005][差分约束]狡猾的商人[水题]

(这题 好水啊 好水啊 好水啊 好水啊!) (话说这两天切的题越来越水了呢!) (貌似网上的题解都是并查集?) 使用前缀和维护,有: 最简单、基础、没难度的差分约束练手题。 ...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)