标签:
根据题意有乘除的关系,为了方便构图,用对数转化乘除关系为加减关系.....
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