POJ 1201 Intervals(差分约束系统)
2015-09-08 22:33
405 查看
我们让xi表示[0,1,...,i-1]中选出数的个数,那么对于一行输入a,b,c,我们有x(b+1)-xa>=c。
特别注意一下隐含条件:0<=x(i+1)-xi<=1,然后建立约束图,spfa求一下最长路就成了。
(stl太慢了。。。慢的我都T了一次)
特别注意一下隐含条件:0<=x(i+1)-xi<=1,然后建立约束图,spfa求一下最长路就成了。
(stl太慢了。。。慢的我都T了一次)
#pragma warning(disable:4996) #include <cstdio> #include <cstring> #include <algorithm> using namespace std; const int N = 50005; int fst , nxt[4 * N], to[N * 4], cost[N * 4], e; int dis , n, q ; bool in ; void add(int u, int v, int c) { to[e] = v; cost[e] = c; nxt[e] = fst[u]; fst[u] = e++; } void spfa() { memset(dis, -1, sizeof dis); memset(in, false, sizeof in); int head = 0, tail = 0; q[tail++] = n + 2;//super source in[n + 2] = true; dis[n + 2] = 0; while (head != tail) { int u = q[head++]; if (head == N)head = 0; in[u] = false; for (int i = fst[u]; i != -1; i = nxt[i]) { int v = to[i], c = cost[i]; if (dis[v] < dis[u] + c) { dis[v] = dis[u] + c; if (!in[v]) { q[tail++] = v; in[v] = true; if (tail == N)tail = 0; } } } } } int main() { int num; scanf("%d", &num); n = 0; e = 0; memset(fst, -1, sizeof fst); while (num--) { int a, b, c; scanf("%d %d %d", &a, &b, &c); add(a, b + 1, c); n = max(n, b + 1); } for (int i = 0; i <= n; i++) { add(n + 2, i, 0); add(i, i + 1, 0); add(i + 1, i, -1); } spfa(); printf("%d\n", dis ); return 0; }
相关文章推荐
- 学习Qt5(5)
- UVA11988_Broken Keyboard (a.k.a. Beiju Text)
- ML基石_1_LearningProblem
- 用冒泡,选择,快速排序的方法排序
- 使用指针数组访问一维数组数据
- JSP基本语句用法总结
- iOS开发个人独立博客收集
- 常用事件响应实习方式
- JAVA中堆和栈的区别
- C# 文件操作的工具类
- 制作一个USB 多启动盘(MBR)
- 反射
- Android:利用selector优化布局,提升用户体验
- enumeration与itertor
- CSDN-markdown编辑器
- 15_09_08 返回值类型错误
- Python time模块函数与时间格式关系图解
- 【J2SE】——基础宏总
- android双进程守护
- 类加载器和代理