hdu 3666 THE MATRIX PROBLEM (差分约束 + 最长路)
来源:互联网 发布:淘宝新店购买 编辑:程序博客网 时间:2024/06/05 02:48
解题思路:
根据题意可以列出等式 u / xij ≥ ai / bj ≥ l / xij 将这个等式两边取对数,可以转化为差分约束所需要的等式,将 ai bj 建立成为节点,再建立一个超级源点,跑最长路,即满足所有条件的解,找到环则说明无解。
因为数据量比较大,所以判环的条件需要减弱一些,我们将节点总数开方进行判断。
AC代码:
/** @Author: wchhlbt* @Last Modified time: 2017-09-21*/#include <vector>#include <list>#include <map>#include <set>#include <queue>#include <stack>#include <bitset>#include <algorithm>#include <functional>#include <numeric>#include <utility>#include <sstream>#include <iostream>#include <iomanip>#include <cstdio>#include <cmath>#include <cstdlib>#include <ctime>#include <cstring>#include <limits>#include <climits>#include <cstdio>#define Fori(x) for(int i=0;i<x;i++)#define Forj(x) for(int j=0;j<x;j++)#define maxn 1000#define inf 0x3f3f3f3f#define ONES(x) __builtin_popcount(x)#define pb push_back#define AA first#define BB second#define _ << " " <<using namespace std;typedef long long ll ;const double eps =1e-8;const int mod = 998244353;const double PI = acos(-1.0);int dx[5] = {0,0,1,-1,0};int dy[5] = {1,-1,0,0,0};inline int read(){ int cnt; scanf("%d",&cnt); return cnt;}//每次使用前需要调用init函数初始化 可以处理负权边//最坏复杂度O(V*E)int inq[maxn];//inq数组储存当前点是否在队列中double d[maxn];int deg[maxn];//记录每个节点入队次数vector< pair<int,double> > e[maxn]; //pair<节点, 边权> int n,m,l,u;void init(){ for(int i = 0; i<maxn; i++){ e[i].clear(); d[i] = -1e18; inq[i] = 0; deg[i] = 0; }}int SPFA(int s)//s为起点{ queue<int> Q; Q.push(s); d[s] = 0; inq[s] = 1; deg[s] = 1; int x = sqrt(n+m);//剪枝优化 while(!Q.empty()){ int hd = Q.front(); Q.pop(); inq[hd] = 0; for(int i = 0; i<e[hd].size(); i++){ int u = e[hd][i].first; double v = e[hd][i].second; if(d[u]<d[hd]+v){//注意这里的判断条件 d[u] = d[hd] + v; if(inq[u]==1) continue;//注意这个地方的剪枝 inq[u] = 1; deg[u]++; if(deg[u]>x) return -1; Q.push(u); } } } return 1;}int main(){ while(~scanf("%d%d%d%d",&n,&m,&l,&u)) { init(); for(int i = 1; i<=n; i++){ for(int j = 1; j<=m; j++){ int c = read(); e[i].pb(make_pair(j+n,log(1.0*c/u))); e[j+n].pb(make_pair(i,log(1.0*l/c))); } } for(int i = 1; i<=n+m; i++)//添加超级远点 e[0].pb(make_pair(i,0)); int ans = SPFA(0);//跑最长路 if(ans==1)puts("YES"); elseputs("NO"); } return 0;}
阅读全文
0 0
- 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 (差分约束判负环)
- 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 THE MATRIX PROBLEM(差分约束 + spfa 深搜判环)
- MVC中$.ajax的post问题
- android 6.0 wifi 随机mac地址存入mvram临时处理方案
- TCP/IP网络编程1
- JDBC编写数据库操作返回JSONArray
- 正则表达式的基本用法说明
- hdu 3666 THE MATRIX PROBLEM (差分约束 + 最长路)
- 条款09:绝不在构造和析构过程中调用virtual函数
- 最小子数组
- 中软高科Java培训专家:10个Java面试小技巧!
- 惊心动魄,网络传输非常慢,而且客户端上传频繁超时。
- 41.最大子数组
- 当一个头文件引用另一个头文件中的类~
- MBA改变了我的人生命运
- As提示警告:主版本52比51新的问题处理