您的位置:首页 > 其它

hdu 3666 THE MATRIX PROBLEM【差分约束系统】

2013-05-13 18:44 232 查看
http://acm.hdu.edu.cn/showproblem.php?pid=3666

题目大意:

题解:

代码:

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <queue>
#include <cmath>
using namespace std;
#define inf 1000000000
const int N = 805 , M = 500050;
int n , m;
struct Edge {
int v , next;
double w;
Edge () {}
Edge (int v,double w,int next):v(v),w(w),next(next) {}
}edge[M];
int E , head
;
void init() {
E = 0; memset(head,-1,sizeof(head));
}
void addedge(int u,int v,double w) {
edge[E] = Edge(v,w,head[u]); head[u] = E ++;
}
int vis
;
double dist
;
bool spfa(int u) {
vis[u] = 1;
for(int i=head[u];i!=-1;i=edge[i].next) {
int v = edge[i].v;
if(dist[v] < dist[u] + edge[i].w) {
dist[v] = dist[u] + edge[i].w;
if(vis[v] == 1) return false;
else if(!spfa(v)) return false;
}
}
vis[u] = 2;
return true;
}
int num

;
int main() {
double u , l;
while(~scanf("%d%d%lf%lf",&n,&m,&l,&u)) {
init();
double du = log(u);
double dl = log(l);
for(int i=0;i<n;i++)
for(int j=0;j<m;j++)
scanf("%d" , &num[i][j]);
for(int i=0;i<n;i++)
for(int j=0;j<m;j++) {
addedge(i , j+n , log((double)num[i][j]) - du);
addedge(j+n , i , dl - log((double)num[i][j]));
}
bool ans = true;
for(int i=0;i<n+m;i++) {
dist[i] = 0;
vis[i] = 0;
}
for(int i=0;i<n+m;i++)
if(!vis[i] && !spfa(i)) {
ans = false;
break;
}
if(ans) puts("YES");
else puts("NO");
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  acm 图论