POJ 1364

题解:最短路式子:d[v]<=d[u]+w

式子1:sum[a+b+1]−sum[a]>c      —      sum[a]<=sum[a+b+1]−c−1       —      (a+b+1,a) −c−1

式子2:sum[a+b+1]−sum[a]<c      —      sum[a+b+1]<=sum[a]+c−1       —      (a,a+b+1)  c−1

注意:先移项,移项完后再处理没有等于的情况。

附加式:sum[0]<=sum[i]+0  —— (i,0) 0 连通所有点

 #include <queue>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std; const int N=;
const int INF=0x3f3f3f3f;
int n,m,cnt;
int head[N],d[N],Time[N];
bool vis[N]; struct edge{
int to,next,w;
}edge[N<<]; void add(int u,int v,int w){
edge[cnt].w=w;edge[cnt].to=v;edge[cnt].next=head[u];head[u]=cnt++;
} void init(){
cnt=;
memset(Time,,sizeof(Time));
memset(head,-,sizeof(head));
} bool SPFA(int st){
for(int i=;i<N;i++) d[i]=INF;
memset(vis,false,sizeof(vis));
queue <int> Q;
Q.push(st);
d[st]=;
vis[st]=true;
Time[st]=;
while(!Q.empty()){
int u=Q.front();
Q.pop();
vis[u]=false;
for(int i=head[u];i!=-;i=edge[i].next){
int v=edge[i].to;
if(d[v]>d[u]+edge[i].w){
d[v]=d[u]+edge[i].w;
if(!vis[v]){
Q.push(v);
vis[v]=true;
Time[v]++;
if(Time[v]>n) return false;
}
}
}
}
return true;
} int main(){
while(scanf("%d",&n)!=EOF&&n){
init();
scanf("%d",&m);
// 约束:s[0]<=s[i]+0
for(int i=;i<=n;i++) add(i,,);// 保证所有点连通
char op[];
for(int i=;i<=m;i++){
int a,b,c;
scanf("%d%d%s%d",&a,&b,&op,&c);
if(op[]=='g') add(a+b,a-,-c-);
else add(a-,a+b,c-);
}
if(SPFA()) printf("lamentable kingdom\n");
else printf("successful conspiracy\n");
}
return ;
}

HDU 3666

题解:由题意得:L<=c[i][j]∗a[i]/b[j]<=U 两边除以c[i][j]c[i][j]    —    L/c[i][j]<=a[i]/b[j]<=U/c[i][j],先两边取对数,得到log(L/c[i][j])<=log(a[i])−log(b[j])<=log(U/c[i][j]),推导出两个式子:

式子1:log(a[i])<=log(U/c[i][j])+log(b[j])

式子2:log(b[j])<=log(a[i])−log(L/c[i][j])

注意:log取double型,n个a和m个b连接,保证了图的连通性,不需要新建边。数据范围注意,有n∗m个点和2∗n∗m条边。注意剪枝

如果有起点,终点的约束,起点d[]距离就赋值为0,其余赋值为无穷。而对于没有起点,终点的约束,全部d[]距离都赋值为无穷。spfa算法,把所有点一开始都入队,这样每个点都遍历到了,就能保证不会有负环由于图的不连通而不被找到。差分约束能把所有约束条件转换成边求最短路,判断负环来解决问题。

#include <cmath>
#include <queue>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std; const int N=+;
int n,m,cnt;
const double INF=1e12;
double l,r,c[N][N],d[N*];
int head[N*],Time[N*];
bool vis[N*]; struct e{
int to,next;
double w;
}edge[N*N*]; // 有反向边 void add(int u,int v,double w){
edge[cnt].w=w;edge[cnt].to=v;edge[cnt].next=head[u];head[u]=cnt++;
} void init(){
cnt=;
memset(Time,,sizeof(Time));
memset(head,-,sizeof(head));
} bool SPFA(int s)
{
for(int i=;i<*N;i++) d[i]=INF;
memset(vis,, sizeof(vis));
queue<int> q;
q.push(s);
d[s]=;
vis[s]=;
Time[s]=;
while(q.size())
{
int u = q.front();q.pop();
vis[u]=;
for(int i=head[u];i!=-;i=edge[i].next)
{
int v=edge[i].to;
double w=edge[i].w;
if(d[v]>d[u]+w)
{
d[v]=d[u]+w;
if(!vis[v])
{
q.push(v);
vis[v]=;
if(++Time[v]>sqrt(n+m))return false;
}
}
}
}
return true;
} int main(){
while(scanf("%d%d%lf%lf",&n,&m,&l,&r)!=EOF){
init();
for(int i=;i<=n;i++)
for(int j=;j<=m;j++)
{
scanf("%lf",&c[i][j]);
add(j+n,i,log(r/c[i][j]));
add(i,j+n,log(c[i][j]/l));
}
if(SPFA()) cout<<"YES"<<endl; // 从连通的顶点开始
else cout<<"NO"<<endl;
}
return ;
}

POJ 1364 / HDU 3666 【差分约束-SPFA】的更多相关文章

  1. poj 1364 King(差分约束)

    题意(真坑):傻国王只会求和,以及比较大小.阴谋家们想推翻他,于是想坑他,上交了一串长度为n的序列a[1],a[2]...a[n],国王作出m条形如(a[si]+a[si+1]+...+a[si+ni ...

  2. POJ 3159 Candies(差分约束+spfa+链式前向星)

    题目链接:http://poj.org/problem?id=3159 题目大意:给n个人派糖果,给出m组数据,每组数据包含A,B,C三个数,意思是A的糖果数比B少的个数不多于C,即B的糖果数 - A ...

  3. poj 3169 Layout(差分约束+spfa)

    题目链接:http://poj.org/problem?id=3169 题意:n头牛编号为1到n,按照编号的顺序排成一列,每两头牛的之间的距离 >= 0.这些牛的距离存在着一些约束关系:1.有m ...

  4. (简单) POJ 3169 Layout,差分约束+SPFA。

    Description Like everyone else, cows like to stand close to their friends when queuing for feed. FJ ...

  5. POJ 1364 King (差分约束)

    King Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 8660   Accepted: 3263 Description ...

  6. hdu 3666(差分约束,手动栈解决超时问题)

    THE MATRIX PROBLEM Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Other ...

  7. poj 1201 Intervals【差分约束+spfa】

    设s为前缀和,首先显然的条件是\[ s_{bi}-s_{ai-1}>=c \],然后隐含的是\[ s_i-s_{i-1}>=0 s_i-s_{i-1}<=1 \] 然后根据差分约束, ...

  8. hdu 1534(差分约束+spfa求最长路)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1534 思路:设s[i]表示工作i的开始时间,v[i]表示需要工作的时间,则完成时间为s[i]+v[i] ...

  9. 【poj3169】【差分约束+spfa】

    题目链接http://poj.org/problem?id=3169 题目大意: 一些牛按序号排成一条直线. 有两种要求,A和B距离不得超过X,还有一种是C和D距离不得少于Y,问可能的最大距离.如果没 ...

随机推荐

  1. 普通函数跟箭头函数中this的指向问题

    箭头函数和普通函数的区别如下. 普通函数:根据调用我的人(谁调用我,我的this就指向谁) 箭头函数:根据所在的环境(我再哪个环境中,this就指向谁) 一针见血式总结: 普通函数中的this: 1. ...

  2. nginx 配置域名转发

    自己测试环境,配置下载目录和一个jenkins的地址: 域名跳转,反向代理 # cat ../nginx.conf user www www; worker_processes ; error_log ...

  3. macbook 安装win7

    长按option进入启动选择页面,选择winpe后进入安装,与普通电脑没有区别.安装后需要安装苹果专用驱动程序Boot Camp,才可以正常使用触控板等驱动

  4. Alpha冲刺(9/10)

    目录 摘要 团队部分 个人部分 摘要 队名:小白吃 组长博客:hjj 作业博客:冲刺倒计时之9 团队部分 后敬甲(组长) 过去两天完成了哪些任务 答辩准备中 和大佬们跟进进度 接下来的计划 准备答辩 ...

  5. ECC加密算法入门介绍 --- 看雪

    标 题:ECC加密算法入门介绍 作 者:zmworm 时 间:2003/05/04 08:32pm 链 接:http://bbs.pediy.com ECC加密算法入门介绍 作者  :ZMWorm[C ...

  6. Golang -- Signal处理

    我们在生产环境下运行的系统要求优雅退出,即程序接收退出通知后,会有机会先执行一段清理代码,将收尾工作做完后再真正退出.我们采用系统Signal来 通知系统退出,即kill pragram-pid.我们 ...

  7. python学习第1天

    01 cpu 内存 硬盘 操作系统 CPU:中央处理器,相当于人大脑. 飞机 内存:临时存储数据. 8g,16g, 高铁 1,成本高. 2,断电即消失. 硬盘:长期存储大量的数据. 1T 512G等等 ...

  8. [转]TSVNCache.exe卡死电脑的解决方法

    转至于https://blog.csdn.net/gnail_oug/article/details/55506820. 正文如下: 每当打开explorer资源管理器的时候,经常卡死,换了固态硬盘还 ...

  9. idea 去除xml文件sql语句背景色

    怎么看idea mapper.xml中写sql语句的那种屎黄屎黄背景颜色不好看 去除背景色 把这两项勾选去掉,然后 把这个背景勾选也去掉,最后 把这个勾选也去掉 另一种方式: 也可以使用这种方式 al ...

  10. with文件操作

    enumeratef = open('lyrics',"r",encoding=""utf-8) #文件句柄"""对文件操作流程 ...