|poj 1201|差分约束|Intervals
2017-02-11 16:06
411 查看
poj传送门
差分约束。
设dis[i]为[1,i]包含在Z集合内数的个数
由题意得,dis[b]−dis[a−1]≥c,
由隐含条件每个数只出现一次或不出现,得0≤dis[i]−dis[i−1]≤1
整理后得,
dis[b]−dis[a−1]≥cdis[i]−dis[i−1]≥0dis[i−1]−dis[i]≥−1
然后按照差分约束系统用SPFA求最长路即可。
差分约束。
设dis[i]为[1,i]包含在Z集合内数的个数
由题意得,dis[b]−dis[a−1]≥c,
由隐含条件每个数只出现一次或不出现,得0≤dis[i]−dis[i−1]≤1
整理后得,
dis[b]−dis[a−1]≥cdis[i]−dis[i−1]≥0dis[i−1]−dis[i]≥−1
然后按照差分约束系统用SPFA求最长路即可。
#include<cstdio> #include<algorithm> #include<cstring> #include<vector> #include<queue> #define ms(i,j) memset(i,j, sizeof i); using namespace std; const int MAXN = 50000 + 5; struct edge { int u, v, c; }E[MAXN*3*2]; vector<int> G[MAXN*2]; int e_num; int n; int minr = 100000000, maxr = -minr; void addE(int u, int v, int c) { e_num++; E[e_num].u = u; E[e_num].v = v; E[e_num].c = c; G[u].push_back(e_num); } int dis[MAXN*2]; int vi[MAXN*2]; void spfa() { ms(dis, -(127/3)); ms(vi, false); queue<int> q; q.push(minr); dis[minr] = 0; while (!q.empty()) { int r = q.front(); q.pop(); vi[r] = false; for (int i=0;i<G[r].size();i++) { edge ed = E[G[r][i]]; if (dis[ed.v]<dis[r]+ed.c) { dis[ed.v] = dis[r] + ed.c; if (!vi[ed.v]) { vi[ed.v] = true; q.push(ed.v); } } } } } int main() { while (scanf("%d", &n)==1) { e_num = 0; for (int i=1;i<=n;i++) { int ai,bi,ci; scanf("%d%d%d", &ai, &bi, &ci); //dis[bi]-dis[ai-1]>=ci addE(ai-1, bi, ci); minr = min(minr, ai-1); maxr = max(maxr, bi); } for (int i=minr+1;i<=maxr;i++) { //0<=dis[i]-dis[i-1]<=1 //dis[i]-dis[i-1]>=0 addE(i-1, i, 0); //dis[i]-dis[i-1]<=1 //dis[i-1]-dis[i]>=-1 addE(i, i-1, -1); } spfa(); printf("%d\n", dis[maxr]); } return 0; }
相关文章推荐
- Web前端学习小建议
- Python I/O
- 根据进程名称,关掉进程
- 网友年龄
- pat a1011
- Web前端技术 自学or老师授课更靠谱
- 寒假篇18
- 关于淘宝镜像cnpm的一些解决问题
- 算法提高 复数归一化
- android 多媒体——音乐播放器
- SLAM学习
- centos 7之文件共享
- 正则表达式特殊字符
- 备忘录模式(17)
- OPENCV之从calibrateCamera到solvePnP(一)
- 高中OJ3515. 【NOIP2013模拟11.6B组】软件公司
- 货车运输 洛谷1967 最大生成树 lca c++
- Codeforces 766D 并查集
- pat a1009(暂缺)
- thinkphp-模板注释