当对问题建立数学模型后,发现其是一个差分方程组,那么问题可以转换为最短路问题,一下分别选用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<iostream>
#include<cstring>
#include<cstdio>
using namespace std; #define MAXN 1005
#define INF 0x3f3f3f3f struct 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<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<queue>
using namespace std; #define MAX 50005
#define INF 0x3f3f3f3f struct 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<int> 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;
}

ACM/ICPC 之 差分约束系统两道(ZOJ2770-POJ1201)的更多相关文章

  1. ACM/ICPC 之 Floyd范例两道(POJ2570-POJ2263)

    两道以Floyd算法为解法的范例,第二题如果数据量较大,须采用其他解法 POJ2570-Fiber Network //经典的传递闭包问题,由于只有26个公司可以采用二进制存储 //Time:141M ...

  2. ACM/ICPC 之 SPFA范例两道(POJ3268-POJ3259)

    两道以SPFA算法求解的最短路问题,比较水,第二题需要掌握如何判断负权值回路. POJ3268-Silver Cow Party //计算正逆最短路径之和的最大值 //Time:32Ms Memory ...

  3. ACM/ICPC 之 SPFA练习两道(ZOJ3088-ZOJ3103)

    两道题都需要进行双向SPFA,比范例复杂,代码也较长,其中第二题应该可以用DFS或者BFS做,如果用DFS可能需要的剪枝较多. ZOJ3088-Easter Holydays //利用SPFA找出下降 ...

  4. 『ACM C++』Virtual Judge | 两道基础题 - The Architect Omar && Malek and Summer Semester

    这几天一直在宿舍跑PY模型,学校的ACM寒假集训我也没去成,来学校的时候已经18号了,突然加进去也就上一天然后排位赛了,没学什么就去打怕是要被虐成渣,今天开学前一天,看到最后有一场大的排位赛,就上去试 ...

  5. ACM/ICPC 之 欧拉回路两道(POJ1300-POJ1386)

    两道有关欧拉回路的例题 POJ1300-Door Man //判定是否存在从某点到0点的欧拉回路 //Time:0Ms Memory:116K #include<iostream> #in ...

  6. ACM/ICPC 之 两道dijkstra练习题(ZOJ1053(POJ1122)-ZOJ1053)

    两道较为典型的单源最短路径问题,采用dijkstra解法 本来是四道练习题,后来发现后面两道用dijkstra来解的话总觉得有点冗余了,因此暂且分成三篇博客(本篇以及后两篇). ZOJ1053(POJ ...

  7. 【转】lonekight@xmu·ACM/ICPC 回忆录

    转自:http://hi.baidu.com/ordeder/item/2a342a7fe7cb9e336dc37c89 2009年09月06日 星期日 21:55 初识ACM最早听说ACM/ICPC ...

  8. POJ1201 Intervals(差分约束系统)

    与ZOJ2770一个建模方式,前缀和当作点. 对于每个区间[a,b]有这么个条件,Sa-Sb-1>=c,然后我就那样连边WA了好几次. 后来偷看数据才想到这题还有两个隐藏的约束条件. 这题前缀和 ...

  9. ACM - ICPC World Finals 2013 C Surely You Congest

    原题下载:http://icpc.baylor.edu/download/worldfinals/problems/icpc2013.pdf 题目翻译: 试题来源 ACM/ICPC World Fin ...

随机推荐

  1. git执行pull命令时,报错

    在图形界面中,执行拉取操作时,出现下面的错误. You asked to pull from the remote 'origin', but did not specifya branch. Bec ...

  2. Android 开发

    1.Activity 子类会重载一个 protected void onCreate(Bundle savedInstanceState) { ... } 方法,其中 savedInstanceSta ...

  3. nyoj 14 会场安排问题(贪心专题)

    会场安排问题 时间限制:3000 ms  |  内存限制:65535 KB 难度:4   描述 学校的小礼堂每天都会有许多活动,有时间这些活动的计划时间会发生冲突,需要选择出一些活动进行举办.小刘的工 ...

  4. VC++6.0一些常见问题解决方法(打开多个窗口、行号、添加文件无响应、更改.exe图标及名称等等)

    背景: 最近使用VC++6.0做一个界面,供测试CAN通信使用.由于客户希望我们提供简单方便的函数接口让其最快速使用CAN,DLL(动态链接库)是不二之选.做DLL需要两个VC窗口进行测试才方便.可是 ...

  5. r8 - ASC 41(俄罗斯多校)

    1 今天干的俄罗斯的一场多校,被虐哭啊,就做出两题. 2 3 4 5 6 7 Gym 100496D Data Mining 8 题目讲得是给你一串数字,然后给你i,p,表示从第i开始,对这串数离散话 ...

  6. cf#305 Mike and Foam(容斥)

    C. Mike and Foam time limit per test 2 seconds memory limit per test 256 megabytes input standard in ...

  7. 如何配置和使用Spring框架的bean

    1. 首先在src目录下新建beans.xml文件,该文件名可更改. 2. 编辑xml文件如下,这里需要注意的是beans的表头中信息需要根据不同的版本对应的内容不同,本例中使用的spring的版本为 ...

  8. LR测试登陆后进行的操作时 绕过登录

    oadrunner web_add_cookie web_add_cookie 这个的函数原来真的能过逃过登录,哈哈,这个苦苦纠结我的问题呀. 函数原型:int web_add_cookie( con ...

  9. java之stream(jdk8)

    一.stream介绍 参考: Java 8 中的 Streams API 详解   Package java.util.stream   Java8初体验(二)Stream语法详解   二.例子 im ...

  10. Java 7 Concurrency Cookbook 翻译 第一章 线程管理之五

    九.使用线程本地变量 一个并发程序的最关键特征就是共享数据.这个特性在那些继承了 Thread 类或者 实现了 Runnable 接口的对象上显得更加重要. 如果你创建一个实现了 Runnable 接 ...