hdu 3666 THE MATRIX PROBLEM
2011-11-15 23:03
411 查看
2010哈尔滨regional的题。
题目描述:
给你一个N*M的矩阵,给你两个数L和U(L <= U)问你是否存在这样的N+M个数字(计作A1….AN, B1…..BM),使矩阵中任意元素Xij,满足:
L <= (Xij * Ai) / Bj <= U
题解:
差分约束,这道题构造差分约束方程特别巧妙。
转换成:Xij * Ai - U * Bj <= 0
L * Bj - Xij * Ai <= 0
由于差分约束中xi - xj <= val 方程的xi与xj前面不能有系数。
利用log运算将乘法转换成为加法,成为了标准的差分约束方程。
注意:
判断有无解(负环)的时候,如果用spfa,不能用入队次数大于N来判断,会超时。
有如下两种比较可靠的方法(一般情况下)
1:某个点入队次数大于sqrt(N)的时候
2:所有入队次数大于T * (N + M),其中T一般取2
出现奇葩错误就是,用SPFA中数组模拟的队列莫名的会WA,改成queue就AC了。不知道是不是自己写错了。
题目描述:
给你一个N*M的矩阵,给你两个数L和U(L <= U)问你是否存在这样的N+M个数字(计作A1….AN, B1…..BM),使矩阵中任意元素Xij,满足:
L <= (Xij * Ai) / Bj <= U
题解:
差分约束,这道题构造差分约束方程特别巧妙。
转换成:Xij * Ai - U * Bj <= 0
L * Bj - Xij * Ai <= 0
由于差分约束中xi - xj <= val 方程的xi与xj前面不能有系数。
利用log运算将乘法转换成为加法,成为了标准的差分约束方程。
注意:
判断有无解(负环)的时候,如果用spfa,不能用入队次数大于N来判断,会超时。
有如下两种比较可靠的方法(一般情况下)
1:某个点入队次数大于sqrt(N)的时候
2:所有入队次数大于T * (N + M),其中T一般取2
出现奇葩错误就是,用SPFA中数组模拟的队列莫名的会WA,改成queue就AC了。不知道是不是自己写错了。
#include <iostream> #include <cstring> #include <algorithm> #include <cmath> #include <queue> #define inf 10000000 #define E 500000 #define V 900 using namespace std; int pnt[E],nxt[E]; int e,head[V]; bool vis[V]; int n,m; double l,u,cost[E],dist[V]; int relax(int u,int v,double c) { if(dist[v]>dist[u]+c) { dist[v]=dist[u]+c; return 1; } return 0; } inline void addedge(int u,int v,double c) { pnt[e]=v; cost[e]=c; nxt[e]=head[u]; head[u]=e++; } bool SPFA(int np) { int i,sum=0; for(i=0;i<np;i++) { vis[i]=0; dist[i]=inf; } dist[0]=0; vis[0]=1; queue<int> que; que.push(0); sum = 0; while(!que.empty()) { int u,v; u = que.front(); que.pop(); vis[u]=false; for(i=head[u];i!=-1;i=nxt[i]) { v=pnt[i]; if(relax(u,v,cost[i]) && !vis[v]) { que.push(v); vis[v]=1; sum++; if(sum>2*(np+2*m)) return 0; } } } return 1; } int main() { int i,j,x; while(scanf("%d%d%lf%lf",&n,&m,&l,&u)!=EOF) { e=0; memset(head,-1,sizeof(int) * (n+m+2)); for(i=0;i<n;i++) for(j=0;j<m;j++) { scanf("%d",&x); addedge(i,n+j,-log(l/x)); addedge(n+j,i,log(u/x)); } if(SPFA(n+m)) puts("YES"); else puts("NO"); } return 0; }
相关文章推荐
- HDU-3666 THE MATRIX PROBLEM
- HDU 3666 The MATRIX PROBLEM (差分约束系统,除化减)
- HDU 3666 THE MATRIX PROBLEM(差分约束 + spfa 深搜判环)
- Hdu 3666 THE MATRIX PROBLEM(差分约束)
- hdu 3666 THE MATRIX PROBLEM (差分约束)
- hdu 3666 THE MATRIX PROBLEM
- hdu 3666 THE MATRIX PROBLEM(差分约束,思路)
- hdu 3666 THE MATRIX PROBLEM(差分约束系统)
- THE MATRIX PROBLEM HDU 3666 UVALive - 5094 取对数+差分约束
- HDU 3666 THE MATRIX PROBLEM (差分约束判负环)
- hdu 3666 THE MATRIX PROBLEM
- hdu 3666 THE MATRIX PROBLEM
- hdu 3666 THE MATRIX PROBLEM 差分约束
- HDU 3666 THE MATRIX PROBLEM 解题报告(差分约束)
- HDU-3666 THE MATRIX PROBLEM
- HDU 3666 THE MATRIX PROBLEM
- HDU 3666 THE MATRIX PROBLEM 差分约束系统
- hdu 3666 THE MATRIX PROBLEM【差分约束系统】
- |hdu 3666|差分约束|THE MATRIX PROBLEM
- hdu_3666_THE MATRIX PROBLEM