摘要: 这也是我第一次碰到差分约束的题。。。好吧。。。赶紧学一下吧。。差分约束系统:假设有这样一组不等式:x1-x2<=0;x1-x5<=-1;x2-x5<=1;x3-x1<=5;x4-x1<=4;x4-x3<=-1;。。。。每个不等式都是有两个未知数的差小于等于某个常数(大于等于也可以,只要两边同乘以-1就可以了),这样的不等式组就称作差分约束系统(这个不等式组要么无解,要么有无数组解,因为若(x1,x2,x3....)是一组解,那么(x1+k,x2+k,x3+k,...)也必然是一组解);差分约束系统与最短路径的关系:差分约束系统的求解可以利用单源最短路径中的三 阅读全文
posted @ 2013-02-01 23:40 ihge2k 阅读(432) 评论(0) 推荐(1) 编辑
摘要: 说实话,其实我还是喜欢用Dijkstra来求单源最短路径。。。但spfa算法有一个好处就是,可以用来处理负边,所以学一下还是有好处的。。况且,形式也很简单,与bfs形式上很相似。。。好吧。。。我还是简单介绍一下spfa算法吧。。。其算法实现过程如下:1、取出队列头顶点,扫描从顶点V出发的每一条边,设每一条边的终点为u,边<V,U>的权值为W,如果有dist[v]+w<dist[u],则修改dist[u]=dist[v]+w,修改path[u]=v;如顶点u不在当前队列中,还要将顶点u入队列;如果dist[v]+w>dist[u],则不做任何处理;2、重复执行以上步骤,直 阅读全文
posted @ 2013-02-01 20:12 ihge2k 阅读(302) 评论(0) 推荐(0) 编辑
摘要: 题目意思很简单,就是让你求两天最短路中共同的公共点的最大个数可以这样理解:我们假设存在2组数据 v0,u0,v1,u1;用path[i][j]代表从点i到点j最短路上最多有多少个点!那么 edge[v0][i]+edge[i][j]+edge[j][u0]=edge[v0][u0]不就表示i到j的最短路为 v0到u0最短路的子路嘛;我们只需更新edge[i][j]中的最大值即可代码如下。。。。View Code 1 #include<iostream> 2 const int N=444; 3 const int inf=10000000; 4 using namespace st 阅读全文
posted @ 2013-02-01 17:48 ihge2k 阅读(263) 评论(0) 推荐(0) 编辑
摘要: 题意还是比较好理解的,即如果矩阵A、B、C满足A*B=C,则代表矩阵A的第i个城市与代表矩阵B的第j个城市之间存在通路。。。orz。。。然后我就按一般的矩阵相等的条件去判断。。。结果TLE了。。。2000MS+了。。。然后就学了一下矩阵的优化。。。优化后。。。60MS。。orz。。。一开始的代码:View Code 1 #include 2 const int N=100; 3 const int inf=10000000; 4 using namespace std; 5 6 int edge[N][N]; 7 int n,m; 8 struct Matrix{ 9 int ma... 阅读全文
posted @ 2013-02-01 14:30 ihge2k 阅读(507) 评论(0) 推荐(0) 编辑