POJ 1364 / HDU 3666 【差分约束-SPFA】
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】的更多相关文章
- poj 1364 King(差分约束)
题意(真坑):傻国王只会求和,以及比较大小.阴谋家们想推翻他,于是想坑他,上交了一串长度为n的序列a[1],a[2]...a[n],国王作出m条形如(a[si]+a[si+1]+...+a[si+ni ...
- POJ 3159 Candies(差分约束+spfa+链式前向星)
题目链接:http://poj.org/problem?id=3159 题目大意:给n个人派糖果,给出m组数据,每组数据包含A,B,C三个数,意思是A的糖果数比B少的个数不多于C,即B的糖果数 - A ...
- poj 3169 Layout(差分约束+spfa)
题目链接:http://poj.org/problem?id=3169 题意:n头牛编号为1到n,按照编号的顺序排成一列,每两头牛的之间的距离 >= 0.这些牛的距离存在着一些约束关系:1.有m ...
- (简单) POJ 3169 Layout,差分约束+SPFA。
Description Like everyone else, cows like to stand close to their friends when queuing for feed. FJ ...
- POJ 1364 King (差分约束)
King Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 8660 Accepted: 3263 Description ...
- hdu 3666(差分约束,手动栈解决超时问题)
THE MATRIX PROBLEM Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Other ...
- poj 1201 Intervals【差分约束+spfa】
设s为前缀和,首先显然的条件是\[ s_{bi}-s_{ai-1}>=c \],然后隐含的是\[ s_i-s_{i-1}>=0 s_i-s_{i-1}<=1 \] 然后根据差分约束, ...
- hdu 1534(差分约束+spfa求最长路)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1534 思路:设s[i]表示工作i的开始时间,v[i]表示需要工作的时间,则完成时间为s[i]+v[i] ...
- 【poj3169】【差分约束+spfa】
题目链接http://poj.org/problem?id=3169 题目大意: 一些牛按序号排成一条直线. 有两种要求,A和B距离不得超过X,还有一种是C和D距离不得少于Y,问可能的最大距离.如果没 ...
随机推荐
- 钉钉消息通知机器人python版
参考官方文档https://open-doc.dingtalk.com/microapp/serverapi2/qf2nxq #coding=utf8 import requests import j ...
- 【转】Java并发编程:如何创建线程?
一.Java中关于应用程序和进程相关的概念 在Java中,一个应用程序对应着一个JVM实例(也有地方称为JVM进程),一般来说名字默认是java.exe或者javaw.exe(windows下可以通过 ...
- 4)django-视图view
视图是django功能函数,结合url使用 1.视图方式 视图方式经常用的有两种 用户GET获取数据 用户POST提交数据 用户第一次访问页面是GET 用户 ...
- 对mysql数据库中字段为空的处理
数据库中字段为空的有两种:一种为null,另一种为空字符串.null代表数值未知,空字符串是有值得,只是为空.有时间我们想把数据库中的数据以excel形式导出时 如果碰到字段为空的,为空的字段会被后面 ...
- js——作用域和闭包
1. js是编译语言,但是它不是提前编译,编译结果不能在分布式系统中移植.大部分情况下,js的编译发生在代码执行前的几微秒(甚至更短) 2. 一般的编译步骤 分词/词法分析:把字符串分解成词法单元 ...
- 在启用属性的情况下启动 Confluence 6
在一些情况下,你可以希望 Confluence 在系统启动的时候就对属性文件进行打印.如果你的 Confluence 经常进行重启,并且你可能忘记来启动针对系统诊断的属性文件日志开关. 编辑 CONF ...
- Confluence 6 嵌入的 H2 数据库
为了让你的 Confluence 在安装成功后就可以使用而不需要使用任何外部的数据库,Confluence 使用一个嵌入的 H2 数据库. 当你选择对 Confluence 进行评估和测试的时候,H2 ...
- OC对象本质
@interface person:NSObject{ @public int _age; } @end @implementation person @end @interface student: ...
- python用unittest+HTMLTestRunner+csv的框架测试并生成测试报告
直接贴代码: import csv # 导入scv库,可以读取csv文件from selenium import webdriverimport unittestfrom time import s ...
- gnuradio 打包脚本
#!/bin/sh echo "cd build" cd build echo "rm -rf **" rm -rf ** echo "cmake . ...