您的位置:首页 > 其它

POJ_3169_Layout

2016-09-27 20:47 513 查看
//见《挑战程序设计竞赛》第2.5.6节

#include<iostream>
#include<cstdio>
using namespace std;

#define MIN(a,b) ((a)<(b)?(a):(b))
#define MAX_N 1000
#define MAX_ML 10000
#define MAX_MD 10000
#define INF 100000000

int N, ML, MD;
int AL[MAX_ML], BL[MAX_ML], DL[MAX_ML];
int AD[MAX_MD], BD[MAX_MD], DD[MAX_MD];

int d[MAX_N];//最短距离

int main() {
scanf("%d%d%d", &N, &ML, &MD);
for (int i = 0; i < ML; i++) scanf("%d%d%d", AL + i, BL + i, DL + i);
for (int i = 0; i < MD; i++) scanf("%d%d%d", AD + i, BD + i, DD + i);

fill(d, d + N, INF);
d[0] = 0;

//用Bellman-Ford算法计算d
for (int k = 0; k < N; k++) {
//从i+1到i的权值为0
for (int i = 0; i + 1 < N; i++) {
if (d[i + 1] < INF) d[i] = MIN(d[i], d[i + 1]);
}
//从AL到BL的权值为DL
for (int i = 0; i < ML; i++) {
if (d[AL[i] - 1] < INF) {
d[BL[i] - 1] = MIN(d[BL[i] - 1], d[AL[i] - 1] + DL[i]);
}
}
//从BD到AD的权值为-DD
for (int i = 0; i < MD; i++) {
if (d[BD[i] - 1] < INF) {
d[AD[i] - 1] = MIN(d[AD[i] - 1], d[BD[i] - 1] - DD[i]);
}
}
}

int res = d[N - 1];
if (d[0] < 0) {
//存在负圈
res = -1;
}
else if (res == INF) {
res = -2;
}
printf("%d\n", res);

return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  poj 3169 layout