hdu 3666 THE MATRIX PROBLEM 差分约束系统
生活随笔
收集整理的這篇文章主要介紹了
hdu 3666 THE MATRIX PROBLEM 差分约束系统
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
題目意思:
一共有n+m個變量。行有那個x1,x2...xn, ? 列有m個b1 b2 ..bm;
然后保證 aij位置 ? ?l<=aij*xi/bj<=r;
解題思路:
對上面這個試子取對數 那么就形成了 ?一個典型的差分約束系統了。
每個不等試形成一條從被減數到減數的相應權值的邊。
然后構圖spfa即可,注意要用鄰接表,這個題目容易超時。
還有注意一點:
spfa判斷存在負權環:
(1) 單個點入隊列的次數大于 sqrt(N) ?, N代表所有點的個數
(2) ?點入隊列的次數總和大于 T*N ?,據說T一般取2.
《算法導論》里面說構造一個原點,他到其他每個點的邊的長度為0,然后再SPFA,
其實直接可以講所有0~n+m點先直接入隊列,然后設置所有長度為0,效果一樣
#include<cstdio> #include<cstring> #include<iostream> #include<cmath> #include<queue> using namespace std;const double MAX=0x3f3f3f3f; int n,m; double l,r; struct node {int v,nxt;double w; }edge[800000]; int head[1000],nume;void add(int u,int v,double w) {edge[nume].v=v;edge[nume].w=w;edge[nume].nxt=head[u];head[u]=nume++; } int spfa(){double dis[1000];int inque[1000],i;queue<int >q;for(i=0;i<=n+m;i++){dis[i]=0;inque[i]=0;q.push(i);}int sum=1;while(!q.empty()){int temp=q.front();q.pop();inque[temp]=0;for(i=head[temp];i!=-1;i=edge[i].nxt){int v=edge[i].v;if(dis[temp]+edge[i].w<dis[v]){dis[v]=dis[temp]+edge[i].w;if(!inque[v]){q.push(v);inque[v]=1;sum++;if(sum>2*(n+m)) return 0;}}}}return 1;}int main() {while(scanf("%d%d%lf%lf",&n,&m,&l,&r)!=EOF){int i,j;nume=0;memset(head,-1,sizeof(head));// for(i=1;i<=n+m;i++) add(0,i,0);for(i=1;i<=n;i++)for(j=1;j<=m;j++){double temp;scanf("%lf",&temp);add(n+j,i,log10(r)-log10(temp));add(i,n+j,log10(temp)-log10(l));}if(spfa()) printf("YES\n");else printf("NO\n");}return 0; }
總結
以上是生活随笔為你收集整理的hdu 3666 THE MATRIX PROBLEM 差分约束系统的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: hdu 4143 A Simple P
- 下一篇: 搜索引擎anti-spam系统设计指南