标签:this har return source for nal roc regional 差分约束
Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 8418 Accepted Submission(s): 2179
//显然不满足差分约束的条件,可以L<=cij*ai/bj<=R两边除cij(cij>0)后取对数得到 //log(L/cij)<=log(ai)-log(bj)<=log(R/cij).只求存不存在就行。但是本体如果用stl //的queue写spfa会超时(可以用节点出队次数小于sqrt(n)判断),可以自己定义一个栈来存储。 #include<iostream> #include<cstdio> #include<cstring> #include<cmath> using namespace std; const int maxn=402; const double inf=100000008; int n,m,tol,head[maxn*2+10],cnt[maxn*2+10],stk[maxn*maxn]; double L,R,dis[maxn*2+10]; bool mark[maxn*2+10]; struct node { int to,next; double val; }nodes[360010]; void Add(int a,int b,double c) { nodes[tol].to=b; nodes[tol].val=c; nodes[tol].next=head[a]; head[a]=tol++; } bool spfa(int s) { for(int i=0;i<=n+m;i++){ dis[i]=inf; cnt[i]=0; mark[i]=0; } int top=0; stk[++top]=s; mark[s]=1;cnt[s]++;dis[s]=0; while(top>0){ int u=stk[top--]; mark[u]=0; for(int i=head[u];i!=-1;i=nodes[i].next){ int v=nodes[i].to; if(dis[v]>dis[u]+nodes[i].val){ dis[v]=dis[u]+nodes[i].val; if(!mark[v]){ mark[v]=1; if(++cnt[v]>=n+m) return 0; stk[++top]=v; } } } } return 1; } int main() { while(scanf("%d%d%lf%lf",&n,&m,&L,&R)==4){ tol=0; memset(head,-1,sizeof(head)); double x; for(int i=1;i<=n;i++){ for(int j=1;j<=m;j++){ scanf("%lf",&x); Add(j+n,i,log(R/x)); Add(i,j+n,-log(L/x)); } } for(int i=1;i<=n+m;i++)//加一个公共源点0 Add(0,i,0); if(spfa(0)) printf("YES\n"); else printf("NO\n"); } return 0; }
标签:this har return source for nal roc regional 差分约束
原文地址:http://www.cnblogs.com/--ZHIYUAN/p/6536119.html