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. Tomcat 部署及配置

    下载,解压tomcat.jdk 1.解压,链接tomcat.jdk tar xf jdk-8u161-linux-x64.tar.gz .tar.gz .0_161/ /usr/local/ .0_1 ...

  2. Html input 常见问题

    1.input回车事件不执行导致页面刷新 场景:在文本框中输入关键字按回车,页面自动刷新了 <form name="keywordForm" method="pos ...

  3. struts2框架之类型转换(参考第二天学习笔记)

    类型转换 1. 什么是类型转换 刚才学习了封装请求参数,把表单数据封装到Action(模型)的属性中.表单中的数据都是String类型,但Action(模型)的属性不一定什么类型. 将来我们还需要数据 ...

  4. Select2日常操作集合

    1.获得多选值 var arraySelected = $('#carTypes').select2("data"); var carTypesDesc = ''; for (va ...

  5. jetty去掉项目名称访问

    对于web项目,访问路径是否包含项目名称等修改访问路径的配置方式: 我所使用的是maven进行管理,只需要在pom.xml中进行如下配置 <!-- jetty插件 jetty:run--> ...

  6. java使用spark/spark-sql处理schema数据

    1.spark是什么? Spark是基于内存计算的大数据并行计算框架. 1.1 Spark基于内存计算 相比于MapReduce基于IO计算,提高了在大数据环境下数据处理的实时性. 1.2 高容错性和 ...

  7. [C]C语言中的指针和内存泄漏几种情况

    引言 原文地址:http://www.cnblogs.com/archimedes/p/c-point-memory-leak.html,转载请注明源地址. 对于任何使用C语言的人,如果问他们C语言的 ...

  8. 硬盘性能测试工具fio

    如何衡量云硬盘的性能 IOPS:每秒读/写次数,单位为次(计数).存储设备的底层驱动类型决定了不同的 IOPS. 吞吐量:每秒的读写数据量,单位为MB/s. 时延:IO操作的发送时间到接收确认所经过的 ...

  9. 给Linux增加swap内存

    有时内存不足时, 编译xxx报错cc: 编译器内部错误:已杀死(程序 cc1) Please submit a full bug report, with preprocessed source if ...

  10. boolalpha的作用

    #include <iostream>using namespace std;int main(){        bool b=true;        cout << &q ...