此题不难,不等式很空易就列出来了,只是要把它转化成减法形式。。卡在这了。。。
其实取一个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; }