根据题意有乘除的关系,为了方便构图,用对数转化乘除关系为加减关系.....
3 3 1 6 2 3 4 8 2 6 5 2 9
YES
/* ***********************************************
Author :CKboss
Created Time :2015年07月29日 星期三 20时55分16秒
File Name :HDOJ3666.cpp
************************************************ */
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <string>
#include <cmath>
#include <cstdlib>
#include <vector>
#include <queue>
#include <set>
#include <map>
using namespace std;
const int maxn=1000;
const double eps=1e-8;
int n,m;
double L,R;
struct Edge
{
int to,next;
double cost;
}edge[maxn*maxn*2];
int Adj[maxn],Size;
void init()
{
memset(Adj,-1,sizeof(Adj)); Size=0;
}
void Add_Edge(int u,int v,double c)
{
edge[Size].to=v;
edge[Size].next=Adj[u];
edge[Size].cost=c;
Adj[u]=Size++;
}
double dist[maxn];
int cQ[maxn];
bool inQ[maxn];
bool spfa(int rt)
{
for(int i=0;i<n+m+10;i++)
dist[i]=1e40;
memset(cQ,0,sizeof(cQ));
memset(inQ,false,sizeof(inQ));
dist[rt]=0;
queue<int> q;
inQ[rt]=true;q.push(rt); cQ[rt]=1;
while(!q.empty())
{
int u=q.front();q.pop();
for(int i=Adj[u];~i;i=edge[i].next)
{
int v=edge[i].to;
if(dist[v]>dist[u]+edge[i].cost)
{
dist[v]=dist[u]+edge[i].cost;
if(!inQ[v])
{
inQ[v]=true;
cQ[v]++;
if(cQ[v]>=sqrt(n+m)) return false;
q.push(v);
}
}
}
inQ[u]=false;
}
return true;
}
int main()
{
//freopen("in.txt","r",stdin);
//freopen("out.txt","w",stdout);
while(scanf("%d%d%lf%lf",&n,&m,&L,&R)!=EOF)
{
init();
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
double x;
scanf("%lf",&x);
int a=i,b=n+j;
Add_Edge(b,a,log(R/x));
Add_Edge(a,b,-log(L/x));
}
}
for(int i=1;i<=n+m;i++)
Add_Edge(0,i,0);
bool fg=spfa(0);
if(fg) puts("YES");
else puts("NO");
}
return 0;
}
版权声明:本文为博主原创文章,未经博主允许不得转载。
HDOJ 3666 THE MATRIX PROBLEM 差分约束
原文:http://blog.csdn.net/ck_boss/article/details/47135823