标签:
从1到n,n个数,从左向右一次排列。给定两种形式的约束条件:
1.
2.
问满足这些限定条件的情况下,数1和n的最大距离是多少?(若约束条件相互矛盾则输出-1,若最大距离可以为无穷大则输出-2)
题目为有三个限制条件的差分约束系统,即:
#include <cstdio>
#include <iostream>
#include <vector>
using namespace std;
const int INF = 0x3fffffff;
struct edge{int from, to, cost;}E[100009];
int v, n, m, size;
void input(void) {
int x, y, z;
for (int i = 0; i < n; i++) {
scanf("%d%d%d", &x, &y, &z);
E[size++] = (edge){x - 1, y - 1, z};
}
for (int i = 0; i < m; i++) {
scanf("%d%d%d", &x, &y, &z);
E[size++] = (edge){y - 1, x - 1, -z};
}
}
int bellman_ford(void) {
int d[v];
fill(d, d + v, INF);
d[0] = 0;
for (int k = 0; k < v; k++) { //由于可能存在负圈会无限更新的情况要注意设置更新次数上限为顶点个数。
bool update = false;
for (int i = 0; i < size; i++) {
if(d[E[i].to] > d[E[i].from] + E[i].cost && d[E[i].from] < INF) {
update = true;
d[E[i].to] = d[E[i].from] + E[i].cost;
}
}
if(!update) break;
}
if(d[0] < 0) return -1;
if(d[v - 1] == INF) return -2;
return d[v - 1];
}
int main(void)
{
while (~scanf("%d%d%d", &v, &n, &m)) {
size = 0;
for (int i = 0; i < v - 1; i++) {
E[size++] = (edge){i + 1, i, 0}; //这个形式很有趣
}
input();
printf("%d\n", bellman_ford());
}
return 0;
}
版权声明:本文为博主原创文章,未经博主允许不得转载。
标签:
原文地址:http://blog.csdn.net/jibancanyang/article/details/47058685