摘要: spfa:1.当给定的图存在负权边时,Dijkstra等算法便没有了用武之地,而Bellman-Ford算法的复杂度又过高,SPFA算法便派上用场了.2.我们约定有向加权图G不存在负权回路,即最短路径一定存在3.思路:用数组d记录每个结点的最短路径估计值,而且用邻接表来存储图G。我们采取的方法是动态逼近法:设立一个先进先出的队列用来保存待优化的结点,优化时每次取出队首结点u,并且用u点当前的最短路径估计值对离开u点所指向的结点v进行松弛操作,如果v点的最短路径估计值有所调整,且v点不在当前的队列中,就将v点放入队尾。这样不断从队列中取出结点来进行松弛操作,直至队列空为止。4.实现方法:建立一个 阅读全文
posted @ 2012-08-05 21:57 pushing my way 阅读(413) 评论(0) 推荐(0) 编辑
摘要: 题意:这个题类似poj2965,但是这个题翻转操作是:翻转单位(i,j)以及与(i,j)相邻的单位。目标也是要求翻转为全白或者全黑需要翻转的次数。分析:枚举第一行(即对第一行的方块进行翻转),16种可能性。翻转第二行的方块,修改对应列的第一行的方块,使得第一行全黑/白。翻转第三行的方块,修改对应列的第二行的方块,使得第二行全黑/白。翻转第四行的方块,修改对应列的第三行的方块,使得第三行全黑/白。最后查看第四行是否满足全黑/白。若不满足,则"Impossible"(只要有一种枚举不满足,其它的枚举也不满足,反之,只要有一种枚举满足,则所有的枚举都满足,因为同一个方块翻转两次, 阅读全文
posted @ 2012-08-05 21:56 pushing my way 阅读(458) 评论(0) 推荐(0) 编辑
摘要: 题意:有一个4*4的+,-矩阵,矩阵中'+'代表门是开着的,'-'代表门是关着的。每一次翻转操作是将对应位置的x和y轴的所有门都进行翻转。求将所给出的状态变成门都开着的状态所需要翻转的门的个数。分析:1.'+'对应位置的行与列各个单位都进行一次翻转操作,那么整个图中只有这个'+'的位置符号改变了。2.因此只要对初始状态中的每一个'+'都进行一次操作,整个图中对应翻转的位置由0开始累加。最后取余2,得到为1的位置就是需要翻转的位置。3.整个图中需要翻转的最大次数是16次。代码:View Code 1 #include 阅读全文
posted @ 2012-08-05 21:53 pushing my way 阅读(203) 评论(0) 推荐(0) 编辑
摘要: 题意:famer给出一些fields,paths,wormholes.其中paths是fields之间的双向正权值边,wormholes是fields之间的单向负权边。求在这个图中是否存在权值为负的回路。这个题用的是bellman_ford算法。其中有一下几个问题:1.在描述Paths时,a bidirectional path between S and E that requires T seconds to traverse. Two fields might be connected by more than one path. 当时没有看到是双向边,WA了。还有,我没有对后半句处理, 阅读全文
posted @ 2012-08-02 20:02 pushing my way 阅读(257) 评论(0) 推荐(0) 编辑
摘要: 题意:给出一个200以内的数n,求出这个数的倍数M,使得M中只有0和1组成。M最多100位。分析:这个题竟然用的是bfs的思想。不看讨论真的想不出来。思路是这样的:1.最高位一定是1.curnum%n不为0时,说明curnum不符合要求。2.判断curnum*10%n和(curnum*10+1)%n是否为0,不为0的话,令curnum=curnum*10和curnum*10+1继续做第二步。直到取余之后为0即可。3.这样就会遇到大数存储的问题。可以这样解决:令 (curnum*10+1)%n=a,求((curnum*10+1)*10+1)%m.由定理(a*b)%n = (a%n *b%n)%n 阅读全文
posted @ 2012-07-30 09:03 pushing my way 阅读(219) 评论(0) 推荐(0) 编辑
摘要: 题意:X坐标轴上有A,B两点,两点的坐标都介于0与100000之间(包括),A点可以有两种方式走动:1.从A走到A-1或者A+1,用时1分钟。2.从A到2*A,用时1分钟,求从A到B最短的时间。分析:这个题用BFS,数组应该开多大呢?有的点乘以2后会比100000大。其实开100001就可以了。如果存在一个路径中有比100000还大的点,那一定存在一条所用时间还要小的所有的点都在100000一下的路径。代码很简单:View Code 1 #include <iostream> 2 #include <stdio.h> 3 #include <queue> 4 阅读全文
posted @ 2012-07-30 08:29 pushing my way 阅读(205) 评论(0) 推荐(0) 编辑
摘要: 题意:数独问题这个题思路很好想,但是在判断3*3小区域的时候出现了错误。写的时候还是稳一些吧,要不然调的时候会吐血的。代码:View Code 1 #include <iostream> 2 #include <stdio.h> 3 #include <memory.h> 4 using namespace std; 5 6 const int maxnum=10; 7 int array[maxnum][maxnum]; 8 bool flag; 9 int cur; 10 struct pos 11 { 12 int x; 13 int y; 14 }. 阅读全文
posted @ 2012-07-29 08:30 pushing my way 阅读(166) 评论(0) 推荐(0) 编辑
摘要: 题意:染色问题,图中之间有边的两个区域不能染成相同的颜色。求将图中每个区域全部染色后需要最少的颜色。分析:参考染色定理得,无论图中有多少区域,最多需要4个区域。因此遍历这四种情况即可.代码:View Code 1 #include <iostream> 2 #include <stdio.h> 3 #include <memory.h> 4 using namespace std; 5 6 const int maxnum=27; 7 bool array[maxnum][maxnum]; 8 int num; 9 10 void fuction()11 { 阅读全文
posted @ 2012-07-29 08:28 pushing my way 阅读(1290) 评论(0) 推荐(0) 编辑
摘要: 四色定理:将平面任意的分为不想重叠的区域,每一个区域总可以用1,2,3,4这四个数字之一来标记,而不会使相邻的两个区域得到相同的数字。这里的相邻区域:指有一整段边界是公共的。如果两个区域只相遇于一点或有限多点,不叫相邻。虽然四色定理目前没有严格的数学证明,但是已被计算机穷举搞定。 阅读全文
posted @ 2012-07-28 12:29 pushing my way 阅读(1276) 评论(0) 推荐(0) 编辑
摘要: 这也是一道DFS题,但写的还是不好。题意:给一个矩阵r*c,求骑士可以从任意一点开始,是否能将这个矩阵中的各个点都走一遍。分析:1.字典顺序啊,lexicographical,当时也没管啥意思,唉。2.不需要找到所有的情况,即如果遍历各点成功,就return ;代码:View Code 1 #include <iostream> 2 #include <stdio.h> 3 #include <memory.h> 4 using namespace std; 5 6 const int maxnum=27; //27,怎么会是8呢 7 bool array[ 阅读全文
posted @ 2012-07-23 12:14 pushing my way 阅读(198) 评论(0) 推荐(0) 编辑