[poj 3159]Candies[差分约束详解][朴素的考虑法]
题意
编号为 1..N 的人, 每人有一个数;
需要满足
dj - di <= c
求1号的数与N号的数的最大差值.(略坑: 1 一定要比 N 大的...difference...不是"差别", 而是"做差"....)
思路
差分约束
差分约束顾名思义就是以"差值"作为约束条件的规划问题. 这个"差值"的特点使得这个问题可以转化为最短路问题(或最长路?)
由于SFPA(或Dijkstra)中的松弛操作:
d[v] <= d[i] + w;
移项之后可以得到
d[v] - d[u] <= w;
这和差分约束的方程形式相同. 并且也满足左边为未知量, 右边为常量; 于是可以建立有向图来解决这个问题.
将未知量设为顶点, 右边常量设为边权; 按照最短路问题的模型, 顶点的值即其到源的距离.则自然有"源"的值为0.
在差分约束系统中, 若有一组解X, 则X + k(任意实数)也为一组解.因为限制条件是"差值".
对应图的模型: 对于这样一组顶点, 源的选择会改变顶点的值, 但不会改变顶点的差值. <暂时没有更精确的理解>
本题中要求1号顶点和N号顶点的最大差值,感觉是"求最长路",为啥用一个求最短路的方法呢?
其实是在于两个问题的关系.
对于差分约束的方程组, 不等式可以全部都不取等号.
而最短路中不等式的用途则是不断调整各个变量的值, 使其对于每一个不等式(限制), 都取满足它的"上界", 即松弛操作. 对应实际操作就是选择一条路.
对于每一条和这个点相连的路, 都会被询问一遍, 如果有更短的路, 就选择新的路. 即是如果发现新的限制条件, 就要[至少]满足(取等号,"上界").
当所有的路都被询问, 亦即所有的限制条件都被满足之时, 得到的就是各个点的最短路长.
对于差分约束系统来说, 则是得到了使得每个约束条件中的两个值的差尽可能大的一组解. 当然对于1 和N来说, d[N] - d[1]是最大的.
取源为1时, d[N]即为答案.
如果要求在同一组约束之下1号和N号的最小差值, 则需要将不等式变形为
d[v] - d[u] >= w;
连接 u -> v 的边, 边权为 w, 求最长路(只要将松弛操作改一下即可). 这样就得到了使得约束条件中的两个值的差尽可能小的一组解.
这是SPFA + stack. 看题解说queue会TLE, 就没有尝试了...
#include <cstdio>
#include <cstring>
#include <stack>
using namespace std;
const int MAXN = 30005;
const int MAXE = 150005;
const int INF = 0x3f3f3f3f;
struct pool
{
int v,pre,w;
} p[MAXE];
int num,head[MAXN],d[MAXN],n,m;
bool inq[MAXN];
stack<int> s;
void clear()
{
while(!s.empty()) s.pop();
memset(head,0,sizeof(head));
memset(d,0x3f,sizeof(d));
memset(inq,false,sizeof(inq));
num = 0;
} int SPFA()
{
d[1] = 0;
inq[1] = true;
s.push(1);
while(!s.empty())
{
int u = s.top();
s.pop();
inq[u] = 0;
for(int tmp=head[u],v;v=p[tmp].v,tmp;tmp=p[tmp].pre)
{
int w = p[tmp].w;
if(d[v]>d[u]+w)
{
d[v] = d[u] + w;
if(!inq[v])
{
inq[v] = true;
s.push(v);
}
}
}
}
return d[n];
} void add(int u, int v ,int w)
{
p[++num].v = v;
p[num].w = w;
p[num].pre = head[u];
head[u] = num;
} int main()
{
while(scanf("%d %d",&n,&m)==2)
{
clear();
while(m--)
{
int u,v,w;
scanf("%d %d %d",&u,&v,&w);
add(u, v, w);
}
printf("%d\n",SPFA());
}
}
Dijkstra + priority_queue
那个排序, 用了long long + 位运算排的序orz..
#include <cstdio>
#include <cstring>
#include <queue>
using namespace std;
const int MAXN = 30005;
const int MAXE = 150005;
typedef long long ll;
struct pool
{
int v,pre,w;
}p[MAXE]; int num,head[MAXN],d[MAXN],m,n;
bool vis[MAXN];
priority_queue < ll, vector<ll>, greater<ll> > pq; void clear()
{
memset(head,0,sizeof(head));
memset(d,0x3f,sizeof(d));
memset(vis,false,sizeof(vis));
num = 0;
while(!pq.empty()) pq.pop();
} void add(int u, int v, int w)
{
p[++num].v = v;
p[num].w = w;
p[num].pre = head[u];
head[u] = num;
} int Dijkstra()
{
d[1] = 0;
pq.push((((ll)d[1])<<32)+1);
// printf("push d[1] = 0\n");
while(!pq.empty())
{
ll t = pq.top(); pq.pop();
int k = t & ((1ll<<32)-1);
// printf("pop d[%d] = %d\n",k,d[k]);
if(k==n) return d[n];
if(vis[k]) continue;
vis[k] = true;
for(int tmp=head[k],v,w;v=p[tmp].v,w=p[tmp].w,tmp;tmp=p[tmp].pre)
{
if(d[v]>d[k]+w)
{
d[v] = d[k] + w;
// printf("push d[%d] = %d\n",v,d[v]);
pq.push((((ll)d[v])<<32)+v);
}
}
}
return d[n];
} int main()
{
while(scanf("%d %d",&n,&m)==2)
{
int u,v,w;
clear();
for(int i=0;i<m;i++)
{
scanf("%d %d %d",&u,&v,&w);
add(u,v,w);
}
printf("%d\n",Dijkstra());
}
}
[poj 3159]Candies[差分约束详解][朴素的考虑法]的更多相关文章
- [poj 1364]King[差分约束详解(续篇)][超级源点][SPFA][Bellman-Ford]
题意 有n个数的序列, 下标为[1.. N ], 限制条件为: 下标从 si 到 si+ni 的项求和 < 或 > ki. 一共有m个限制条件. 问是否存在满足条件的序列. 思路 转化为差 ...
- POJ 3159 Candies 差分约束dij
分析:设每个人的糖果数量是a[i] 最终就是求a[n]-a[1]的最大值 然后给出m个关系 u,v,c 表示a[u]+c>=a[v] 就是a[v]-a[u]<=c 所以对于这种情况,按照u ...
- poj 3159 Candies 差分约束
Candies Time Limit: 1500MS Memory Limit: 131072K Total Submissions: 22177 Accepted: 5936 Descrip ...
- 差分约束详解&&洛谷SCOI2011糖果题解
差分约束系统: 如果一个系统由n个变量和m个约束条件组成,形成m个形如ai-aj≤k的不等式(i,j∈[1,n],k为常数),则称其为差分约束系统(system of difference const ...
- POJ 3159 Candies (图论,差分约束系统,最短路)
POJ 3159 Candies (图论,差分约束系统,最短路) Description During the kindergarten days, flymouse was the monitor ...
- 1_03_MSSQL课程_约束详解
复习: ->创建数据库的SQL:******** create database 数据库名 on ( name=‘’, size=5MB, filegrowth=2MB, filename=&q ...
- 图论--差分约束--POJ 3159 Candies
Language:Default Candies Time Limit: 1500MS Memory Limit: 131072K Total Submissions: 43021 Accep ...
- POJ 3159 Candies(SPFA+栈)差分约束
题目链接:http://poj.org/problem?id=3159 题意:给出m给 x 与y的关系.当中y的糖数不能比x的多c个.即y-x <= c 最后求fly[n]最多能比so[1] ...
- POJ 3159 Candies(差分约束,最短路)
Candies Time Limit: 1500MS Memory Limit: 131072K Total Submissions: 20067 Accepted: 5293 Descrip ...
随机推荐
- EditText 默认不获取焦点,弹出软键盘布局变形解决方案
关于弹出软键盘布局变形解决方案: 在androidMainfest.xml文件中在此Activity中写入 android:windowSoftInputMode="adjustPan&qu ...
- Js把URL中的参数解析为一个对象
<!DOCTYPE HTML> <html> <head> <meta charset="utf-8" /> <title&g ...
- [LeetCode]题解(python):147-Insertion Sort List
题目来源: https://leetcode.com/problems/insertion-sort-list/ 题意分析: 用插入排序排序一个链表. 题目思路: 这题没什么好说的,直接用插入排序就行 ...
- 3000本IT书籍下载地址
http://www.shouce.ren/post/d/id/112300 黑客攻防实战入门与提高.pdfhttp://www.shouce.ren/post/d/id/112299 黑 ...
- Oracle EBS-SQL (INV-1):库存货位列表.sql
select inventory_location_id, organization_id, description, subinventory_code, segment1 inventory_lo ...
- 深入GDI图像显示
摘 要:本文首先给出了一种结合了DIB和DDB两种位图优点的图像显示方法,其次对GDI函数的高级应用,如透明位图显示.图像旋转显示.图像镜像显示进行了研究. 关键词:GDI图像显示,特殊GDI函数的 ...
- AspectJ AOP例子
最近在学习Spring AOP,其中涉及到AspectJ的AOP框架.主要参考:http://howtodoinjava.com/spring/spring-aop/spring-aop-aspect ...
- python 【第四篇】:面向对象(一)
1.前言 提笔忘字,感慨良多!python自习前前后后有一年多了吧,貌似花了不少时间,其实没学到啥东西,都是在面向对象编程之前基础知识这块一直打转转,每次到了面向对象这块就感觉很蒙,看两天直接放弃,从 ...
- python之lambda表达式
lambda函数小结 1.lambda表达式: 以前看人家写一个长式子就能干一件我写一个函数干的事情觉得好帅,现在通过学习知道了lambda表达式其原理就是一个函数,而且是一个只能处理简单功能的函数. ...
- uva 639 Don't Get Rooked 变形N皇后问题 暴力回溯
题目:跟N皇后问题一样,不考虑对角冲突,但考虑墙的存在,只要中间有墙就不会冲突. N皇后一行只能放一个,而这题不行,所以用全图暴力放棋,回溯dfs即可,题目最多就到4*4,范围很小. 刚开始考虑放一个 ...