差分约束算法
一 定义
差分约束算法通常用于解决差分约束算法==(属于线性规划)==,解决差分约束问题我们通常将它转化为最短路或者最长路问题,比如我们有如下的差分关系 { x 1 − x 2 > 3 x 2 − x 3 > 2 . . . \begin{cases}&x_{1}-x_{2}>3\\&x_{2}-x_{3}>2\\&... \end{cases} ⎩⎪⎨⎪⎧x1−x2>3x2−x3>2...,我们可以将每一个变元都看作是一个点, x 1 − x 2 > 3 x_{1}-x_{2}>3 x1−x2>3可以转化为一条从 x 2 x_{2} x2到 x 1 x_{1} x1的一条长度为3的边。在这种关系之下我们可以得到一条最短路。使得满足这种最短的关系。得到最短路之后,得到最短路之后再进行判读是否满足每一个差分
约束的关系,如果满足,则可行。
二 模版题and code
#include <iostream>
using namespace std;
struct node{
int from , to , dis;
};
node e[5010];
int n , m;
int dis[5010];
int main(){
cin >> n >> m;
for(int i = 1; i <= m; i++) cin >> e[i].to >> e[i].from >> e[i].dis;
for(int i = 1; i <= n - 1; i++)
for(int j = 1; j <= m; j++)
dis[e[j].to] = min(dis[e[j].to] , dis[e[j].from] + e[j].dis);
for(int j = 1; j <= m; j++)
if(dis[e[j].to] > dis[e[j].from] + e[j].dis){
cout << "NO";
return 0;
}
for(int i = 1; i <= n; i++) cout << dis[i] << " ";
return 0;
}