学习链接:
http://www.cppblog.com/menjitianya/archive/2015/11/19/212292.html
http://972169909-qq-com.iteye.com/blog/1185527
摘录:(引用)
第一:
感觉难点在于建图
第二:
①:对于差分不等式,a - b <= c ,建一条 b 到 a 的权值为 c 的边,求的是最短路,得到的是最大值
②:对于不等式 a - b >= c ,建一条 b 到 a 的权值为 c 的边,求的是最长路,得到的是最小值
③:存在负环的话是无解
④:求不出最短路(dist[ ]没有得到更新)的话是任意解
第三:
一种建图方法:
设x[i]是第i位置(或时刻)的值(跟所求值的属性一样),那么把x[i]看成数列,前n项和为s[n],则x[i] = s[i] - s[i-1];
那么这样就可以最起码建立起类似这样的一个关系:0 <= s[i] - s[i-1] <= 1;
其他关系就要去题目探索了
学习了一个spfa模板:
bool SPFA(int source)
{
int u,v,w,i;
memset(vis,0,sizeof(vis));
memset(inq,0,sizeof(inq));
for (i=0;i<=n;i++) dis[i]=-INF;
dis[source]=0;
inq[source]=1;
vis[source]=1;
queue<int>q;
points now;
q.push(source);
while (!q.empty())
{
u=q.front(); q.pop();
inq[u]=0;
for (i=0;i<G[u].size();i++)
{
v=G[u][i].u;
w=G[u][i].c;
if (dis[v]<dis[u]+w)
{
dis[v]=dis[u]+w;
if (!inq[v])
{
inq[v]=1;
q.push(v);
if (++vis[v]>n) return false;
}
}
}
}
return true;
}
套模板注意事项:
判断负环的n代表点数
清dis的时候要注意范围,要记得修改(因为直接套了模板wa了12次。。。)