赞
踩
差分约束算法通常用于解决差分约束算法==(属于线性规划)==,解决差分约束问题我们通常将它转化为最短路或者最长路问题,比如我们有如下的差分关系 { x 1 − x 2 > 3 x 2 − x 3 > 2 . . . {x1−x2>3x2−x3>2... ⎩⎪⎨⎪⎧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的边。在这种关系之下我们可以得到一条最短路。使得满足这种最短的关系。得到最短路之后,得到最短路之后再进行判读是否满足每一个差分
约束的关系,如果满足,则可行。
#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; }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。