HDU1384 Intervals (差分约束系统)
2016-07-27 11:08
429 查看
差分约束基本题型:
给出一个序列,1至n这n个数字,然后已知从i 到j 的数字和至多a、至少b,给出这么一组,然后求每个数字最小为多少,或者求总和最小为多少。
于是构造,设s[i]为0到i的和,那么s[1]即为第一个数字,s[2]-s[1]即为第二个数字,于是给出的条件转换为:
s[i] - s[j] >= b
s[i] - s[j] <= a
s[i] - s[i-1] >= 0
s[i] - s[i-1] <= V (*如果是1到n这n个容器,每个容器有容量,或者特殊情况n个布尔值,那么需要加上这个限制条件)
结论,两个选择:
1. 如果 xi - xj >= w,那么从xj到xi连一条又向边,然后求从前往后(假设j < i)的最长路;
2. 如果 xi - xj >= w,那么转化为xj - xi <= -w,于是从xi到xj连一条有向边,然后求从后往前的最短路(亦假设j<i)。
题目大意:
给出一些区间[ai,bi]和每个区间最少需要几个点ci,然后问总共最少需要几个点满足所有区间的要求。比如给出1 5 2和 4 6 2,就是说1到5需要2个点,4到6需要2个点,那么最少需要2个点就可以满足条件了。
给出一个序列,1至n这n个数字,然后已知从i 到j 的数字和至多a、至少b,给出这么一组,然后求每个数字最小为多少,或者求总和最小为多少。
于是构造,设s[i]为0到i的和,那么s[1]即为第一个数字,s[2]-s[1]即为第二个数字,于是给出的条件转换为:
s[i] - s[j] >= b
s[i] - s[j] <= a
s[i] - s[i-1] >= 0
s[i] - s[i-1] <= V (*如果是1到n这n个容器,每个容器有容量,或者特殊情况n个布尔值,那么需要加上这个限制条件)
结论,两个选择:
1. 如果 xi - xj >= w,那么从xj到xi连一条又向边,然后求从前往后(假设j < i)的最长路;
2. 如果 xi - xj >= w,那么转化为xj - xi <= -w,于是从xi到xj连一条有向边,然后求从后往前的最短路(亦假设j<i)。
题目大意:
给出一些区间[ai,bi]和每个区间最少需要几个点ci,然后问总共最少需要几个点满足所有区间的要求。比如给出1 5 2和 4 6 2,就是说1到5需要2个点,4到6需要2个点,那么最少需要2个点就可以满足条件了。
#include <set> #include <map> #include <queue> #include <deque> #include <cmath> #include <vector> #include <string> #include <cstdio> #include <cstdlib> #include <cstring> #include <iostream> #include <algorithm> using namespace std; #define L(i) i<<1 #define R(i) i<<1|1 #define INF 0x3f3f3f3f #define pi acos(-1.0) #define eps 1e-9 #define maxn 1000010 #define MOD 1000000007 struct Edge { int to,next,weight; }edge[4*50010]; int n,m,k; int dis[50010],tot,ans; int headlist[50010],vis[50010]; void add_edge(int u,int v,int weight) { edge[tot].to = v; edge[tot].weight = weight; edge[tot].next = headlist[u]; headlist[u] = tot++; } void SPFA(int u) { queue<int> q; memset(vis,0,sizeof(vis)); memset(dis,-INF,sizeof(dis)); q.push(u); vis[u] = 1; dis[u] = 0; while(!q.empty()) { int x = q.front(); q.pop(); vis[x] = 0; for(int i = headlist[x]; i != -1; i = edge[i].next) { int y = edge[i].to; if(dis[y] < dis[x] + edge[i].weight) { dis[y] = dis[x] + edge[i].weight; if(!vis[y]) { q.push(y); vis[y] = 1; } } } } } int main() { int t; //scanf("%d",&t); while(scanf("%d",&n) != EOF) { tot = 0; memset(headlist,-1,sizeof(headlist)); int mx = INF,my = 0; for(int i = 0; i < n; i++) { int x,y,z; scanf("%d%d%d",&x,&y,&z); add_edge(x,y+1,z); mx = min(mx,x); my = max(my,y+1); } for(int i = mx; i <= my; i++) { add_edge(i-1,i,0); add_edge(i,i-1,-1); } SPFA(mx); printf("%d\n",dis[my]); } return 0; }
相关文章推荐
- QT的一些注意点与方法积累
- Windows 2008 R2 辅助域控制器强制降级
- CCS中CMD文件详解
- AFN框架 之同时兼容Http和Https通讯 配置
- I - Red packet
- 文件系统
- 顺序表应用6:有序顺序表查询
- Eclips加载不了rt.jar下面的sun.net.ftp.FtpClient类,解决方法
- UVA 11234-Expressions
- servlet
- 1分钟完成:linux定时清理日志
- 1092 A+B for Input-Output Practice (IV)
- Mac上面搭建web服务器
- xpath使用
- hdu 1847 Good Luck in CET-4 Everybody! (SG函数入门)
- js性能优化的小知识
- 活动H5 类型总结 啪啪啪哎哟A股你大爷啊
- 顺序表应用5:有序顺序表归并
- JSONModel源代码解析
- 1091 A+B for Input-Output Practice (III)