博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
ACM/ICPC 之 差分约束系统两道(ZOJ2770-POJ1201)
阅读量:5241 次
发布时间:2019-06-14

本文共 2580 字,大约阅读时间需要 8 分钟。

当对问题建立数学模型后,发现其是一个差分方程组,那么问题可以转换为最短路问题,一下分别选用Bellmanford-SPFA解题

 


 

ZOJ2770-Burn the Linked Camp

 

//差分约束方程组-转换为最短路问题//d[v] <= d[u] + dis[u][v]	->	d[v] - d[u] <= dis[u][v]//Time:110Ms	Memory:12116#include
#include
#include
using namespace std;#define MAXN 1005#define INF 0x3f3f3f3fstruct Edge { int u, v, w; Edge(){} Edge(int uu,int vv,int ww):u(uu),v(vv),w(ww){}}e[MAXN*MAXN];int n, m, le;int sd[MAXN]; //从1-i兵营总共最多多少人int d[MAXN];bool bellmanford(int x){ memset(d, INF, sizeof(d)); d[x] = 0; for (int i = 0; i < n; i++) { for (int j = 0; j < le; j++) { int u = e[j].u, v = e[j].v; int w = e[j].w; if (d[v] > d[u] + w) d[v] = d[u] + w; } } for (int i = 0; i < le; i++) if (d[e[i].v] > d[e[i].u] + e[i].w) return false; return true;}int main(){ //freopen("in.txt", "r", stdin); while (scanf("%d%d", &n, &m) != EOF) { int a, b, w; le = 0; for (int i = 1; i <= n; i++) { scanf("%d", &sd[i]); sd[i] += sd[i - 1]; e[le++] = Edge(i, i - 1, 0); e[le++] = Edge(i - 1, i, sd[i] - sd[i-1]); } for (int i = 1; i <= m; i++) { scanf("%d%d%d", &a, &b, &w); e[le++] = Edge(b, a - 1, -w); //e[le++] = Edge(a - 1, b, sd[b] - sd[a - 1]); } if (!bellmanford(n)) printf("Bad Estimations\n"); else printf("%d\n", -d[0]); } return 0;}

 


POJ1201_Intervals

 

//差分约束系统-SPFA//求一个集合Z中最少有多少个数//给定Z与n个区间的最小交集个数//Time:407Ms	Memory:2624K#include
#include
#include
#include
#include
using namespace std;#define MAX 50005#define INF 0x3f3f3f3fstruct Edge { int u, w, next; Edge(){} Edge(int uu,int ww,int nn):u(uu),w(ww),next(nn){}}e[3*MAX];int l, r, m, le;int h[MAX];int d[MAX];bool v[MAX];void spfa(int x){ memset(d, INF, sizeof(d)); memset(v, false, sizeof(v)); d[x] = 0; queue
q; q.push(x); v[x] = true; while (!q.empty()) { int cur = q.front(); q.pop(); v[cur] = false; for (int i = h[cur]; i != -1; i = e[i].next) { int u = e[i].u, w = e[i].w; if (d[u] > d[cur] + w) { d[u] = d[cur] + w; if (!v[u]) { v[u] = true; q.push(u); } } } }}int main(){ memset(h, -1, sizeof(h)); scanf("%d", &m); l = INF; r = 0; for (int i = 1; i <= m; i++) { int a, b, w; scanf("%d%d%d", &a, &b, &w); r = max(b, r); l = min(a, l); e[le] = Edge(a - 1, -w, h[b]); h[b] = le++; } for (int i = l; i <= r; i++) { e[le] = Edge(i - 1, 0, h[i]); h[i] = le++; e[le] = Edge(i, 1, h[i - 1]); h[i - 1] = le++; } spfa(r); printf("%d\n", d[r] - d[l-1]); return 0;}

 

转载于:https://www.cnblogs.com/Inkblots/p/5515614.html

你可能感兴趣的文章
Vue
查看>>
python-三级菜单和购物车程序
查看>>
条件断点 符号断点
查看>>
VMware12 + Ubuntu16.04 虚拟磁盘扩容
查看>>
水平垂直居中
查看>>
MySQL简介
查看>>
设计模式之桥接模式(Bridge)
查看>>
jquery的$(document).ready()和onload的加载顺序
查看>>
Python Web框架Django (五)
查看>>
.net学习之继承、里氏替换原则LSP、虚方法、多态、抽象类、Equals方法、接口、装箱拆箱、字符串------(转)...
查看>>
【codevs1033】 蚯蚓的游戏问题
查看>>
【程序执行原理】
查看>>
python的多行注释
查看>>
连接Oracle需要jar包和javadoc文档的下载
查看>>
UVA 10976 - Fractions Again?!
查看>>
Dreamweaver cc新版本css单行显示
查看>>
【android】安卓的权限提示及版本相关
查看>>
JavaScript可否多线程? 深入理解JavaScript定时机制
查看>>
IOS基础学习
查看>>
PHP 导出 Excell
查看>>