[csp-201809-4]再卖菜 差分约束or记忆化搜索
先更新第一个做法:差分约束
转化成最长路,求出的每一个解是满足差分方程的最小值
spfa求最短路
对于边(x->y) 有:
1 if(dis[y] > dis[x] + a[i].d) dis[y]=dis[x]+a[i].d;
dis[y]的初始值为INF,dis[y]会是满足所有约束条件之中所有可能的值之中最大的(更新到最大的就不会再更新了)。
贴一个简略的证明:
同理,最长路求出来的是所有可能解之中最大的。
这题是字典序最小,那么我们要转化成最长路来求,求到的每个s[i]都是可能的值中最小的一个。注意,菜价要是正整数(>=1)。
1 #include<bits/stdc++.h> 2 using namespace std; 3 4 const int N=3100; 5 struct node{ 6 int x,y,d,next; 7 }a[2*N]; 8 int n,al,first[N],b[N],s[N]; 9