2011年7月31日
摘要: 本题可抽象为:给出一些点和边,边分为两种,一种为双向边,权值为正,一种为单向边,权值为负。要求给定一个图,判断图中是否有负环。很显然,需要Bellman-Ford算法。因为本题只需判断是否有负环的存在,而不需求最短路,所以可令初始dis均为0,如果第n次松弛成功,则有负环;否则没有。//9043487 NKHelloWorld 3259 Accepted 452K 79MS G++ 1459B 2011-07-31 13:15:57//1A#include <cstdio>#include <cstring>struct date{ int st,ed,d;}edge[ 阅读全文
posted @ 2011-07-31 14:07 NKHe!!oWor!d 阅读(255) 评论(0) 推荐(0) 编辑
  2011年7月30日
摘要: 本题题目名字跟题目关系貌似不大,或者是因为我没看懂第一段。本题是说有最多100个room,每个room有一个值,从1号room、100体力值开始,通过某种路径走到n号room,每到一个房间就加上或减去相应的体力值。要求过程中体力值不能小于0 。等于0的临界情况是否算die不清楚。。。两种理解都可以过。因为存在可以通过转圈来积攒体力,即存在环,所以单独的floyed和迪杰斯特拉无法求解,需用Bellman-Ford来对付,但是在松弛过程中又需要保证松弛的点最终是可以到达终点的,即“如果存在环,那么终点应该在环中”。所以先用floyed来判断各个点是否能通向终点,松弛过程中只对能到达终点的点进行松 阅读全文
posted @ 2011-07-30 21:56 NKHe!!oWor!d 阅读(324) 评论(0) 推荐(0) 编辑
  2011年7月29日
摘要: #include <cstdio>#include <cstring>int n,m;double dis[31][31],rate;char name[31][30],name1[30],name2[30];int getpos(char *s){ int i; for(i=1;i<=n;i++) { if(strcmp(s,name[i])==0) { return i; } } return 0;}int main(){ int i,j,k,casenum = 0; while(scanf("%d",&n),n!=0) { cas 阅读全文
posted @ 2011-07-29 13:53 NKHe!!oWor!d 阅读(122) 评论(0) 推荐(0) 编辑
  2011年7月28日
摘要: 最短路径学了几种算法,但是一直没有学这个Bellman-Ford算法,因为在求最短路径的时候复杂度较高,不如某D氏算法。但是在求解一些特定问题的时候,他能判断是否存在回路这一特性能发挥很好的最用。例如对于POJ1860,这题英文描述比较NC,看了discuss之后才敢确定自己理解的是正确的。这题是可以多次经过同一种货币的。因此,当求出最长路后,除了是s点的dis大于v的情况是YES外,如果有正回路存在,也是可以达到目的的。这其中由一个玄机是虽然图是单向图,但是题目保证A->B可行时B->A也一定存在。这就是只要存在正回路就能达到目的的原因。//9042312 NKHelloWorl 阅读全文
posted @ 2011-07-28 21:39 NKHe!!oWor!d 阅读(187) 评论(0) 推荐(0) 编辑