题意:输入a、b、c三个意思是b最大不能超过a 的值c。意味着a+c>b,想一下最短路的松弛条件刚好满足。
解释一下差分约束:如果一个系统由n个变量和m个约束条件组成,其中每个约束条件形如xj-xi<=bk(i,j∈[1,n],k∈[1,m]),则称其为差分约束系统(system of difference constraints)。亦即,差分约束系统是求解关于一组变量的特殊不等式组的方法。
这道题刚好是满足这样的条件。差分约束可以转换成最短路来求解。http://www.cppblog.com/menjitianya/archive/2015/11/19/212292.html 来自大牛的解释。
#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
const int maxn1 = 30005;
const int maxn2 = 150005;
const int inf = 0x3f3f3f3f;
class Node
{
public:
int e,v;
int next;
}edge[maxn2];
int n,m;
int head[maxn1];
int dis[maxn1];
int visit[maxn1];
void spfa()
{
for(int i = 1;i <= n; i++)
dis[i] = inf;
memset(visit,0,sizeof(visit));
int Q[maxn1];
int pos = 0;
Q[pos++] = 1;
visit[1] = true;
dis[1] = 0;
while(pos != 0){
int u = Q[--pos];
visit[u] = false;
for(int i = head[u];i != -1; i = edge[i].next){
int to = edge[i].e;
if(dis[to] < dis[u] + edge[i].v)
continue;
dis[to] = dis[u] + edge[i].v;
if(!visit[to]){
Q[pos++] = to;
visit[to] = true;
}
}
}
}
int main()
{
//freopen("in.txt","r",stdin);
scanf("%d%d",&n,&m);
memset(head,-1,sizeof(head));
int a,b,c;
for(int i = 1;i <= m; i++){
scanf("%d%d%d",&a,&b,&c);
edge[i].e = b;
edge[i].v = c;
edge[i].next = head[a];
head[a] = i;
}
spfa();
printf("%d\n",dis[n]);
return 0;
}