-
Layout
- POJ - 3169
- 转自:https://blog.csdn.net/mengxiang000000/article/details/52613328
- 注意图是单向的
- 差分约束系统问题,能够将问题转化为最短路问题。以下给出转化过程: 假设有这样的三个条件: 那么我们可以将不等式1和不等式2相加得到: 那么如果想要得到x1和x3的最大差值,那么其实就是取min(k1+k2,k3);
- 对应ml条信息: ①牛A和牛B的距离不想超过D,那么建立不等式:posA-posB=D,那么我们左右两边同乘-1有:posB-posA<=-D,那么加入到图中add(B,A,-D)即可。 4、图建立好之后直接跑最短路即可。 对应输出: ①如果dis【n】==inf,输出-2; ②否则输出dis【n】; ③如果在跑SPFA过程中发现了负环,说明问题无解,那么输出-1.
-
#include <iostream> #include <cstring> #include <queue> #include <stdio.h> using namespace std; #define maxn 1333 #define inf 0x3f3f3f3f int mmp[maxn][maxn],k,v; int dis[maxn],n,ml,md,u; int vis[maxn],book[maxn]; void spfa() { queue<int>q; dis[1]=0; q.push(1); while(!q.empty()) { int u=q.front(); q.pop(); vis[u]=0; book[u]++; if(book[u]>n) { cout<<"-1"<<endl; return; } for(int i=1; i<=n; i++) { if(dis[i]>dis[u]+mmp[u][i]) { dis[i]=dis[u]+mmp[u][i]; if(!vis[i]) { vis[i]=1; q.push(i); } } } } if(dis[n]==inf) cout<<-2<<endl; else cout<<dis[n]<<endl; return ; } int main() { ios::sync_with_stdio(false); cin>>n>>ml>>md; for(int i=1; i<=n; i++) for(int j=1; j<=n; j++) { mmp[i][j]=inf; if(i==j) mmp[i][j]=0; vis[i]=book[i]=0; dis[i]=inf; } while(ml--) { cin>>u>>v>>k; mmp[u][v]=k; } while(md--) { cin>>u>>v>>k; mmp[v][u]=-k; } spfa(); return 0; }
Layout -拆分约束+负环
最新推荐文章于 2022-05-29 17:57:04 发布