标签:inf amp eal greatest iss 无限 mono long turn
| Time Limit: 1000MS | Memory Limit: 65536K | |
| Total Submissions: 9427 | Accepted: 4517 |
Description
Input
Output
Sample Input
4 2 1 1 3 10 2 4 20 2 3 3
Sample Output
27
Hint
题意:
农夫养了N头牛。编号为1到N。
依照编号顺序排成一排。在他们之间,有一些牛关系比較好。所以希望彼此之间不超过一定距离,也有一些牛关系比較不好,希望彼此之间至少要满足某个距离。给出了ML个关系好的,以及MD个关系不好的,求1号牛和N号牛之间的最大距离。假设不存在不论什么一种排列方法满足条件则输出-1.无限大的情况输出-2.
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int maxn = 10000 + 10;
const int INF = 100000000;
int N, ML, MD;
int AL[maxn], BL[maxn], DL[maxn];
int AD[maxn], BD[maxn], DD[maxn];
int d[1010];
void solve()
{
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);
}
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]);
}
solve();
return 0;
}
标签:inf amp eal greatest iss 无限 mono long turn
原文地址:http://www.cnblogs.com/mfmdaoyou/p/7221174.html