HDU 3666
此题不难,不等式很空易就列出来了,只是要把它转化成减法形式。。卡在这了。。。
其实取一个log对数就好了。。。要记住这个技巧。用基于dfs的spfa。。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
#include<cmath>
using namespace std;
const int N=810;
struct Edge{
int to,nxt;
double cap;
}edge[N*N];
int n,m,cnt,head[N];
int vis[N],instack[N];
double dis[N],L,U;
void addedge(int cu,int cv,double cw){
edge[cnt].to=cv; edge[cnt].cap=cw; edge[cnt].nxt=head[cu];
head[cu]=cnt++;
}
int SPFA(int u){
if(instack[u])
return 0;
instack[u]=1;
vis[u]=1;
for(int i=head[u];i!=-1;i=edge[i].nxt){
int v=edge[i].to;
if(dis[v]>dis[u]+edge[i].cap){
dis[v]=dis[u]+edge[i].cap;
if(!SPFA(v))
return 0;
}
}
instack[u]=0;
return 1;
}
int solve(){
memset(vis,0,sizeof(vis));
memset(instack,0,sizeof(instack));
memset(dis,0,sizeof(dis));
for(int i=1;i<=n+m;i++)
if(!vis[i]){
if(!SPFA(i))
return 0;
}
return 1;
}
int main(){
//freopen("input.txt","r",stdin);
while(~scanf("%d%d%lf%lf",&n,&m,&L,&U)){
cnt=0;
memset(head,-1,sizeof(head));
double x;
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++){
scanf("%lf",&x);
addedge(j+n,i,log(U/x));
addedge(i,j+n,-log(L/x));
}
if(solve())
puts("YES");
else
puts("NO");
}
return 0;
}

浙公网安备 33010602011771号