随笔分类 - Graph Theory
图论
SPFA模板
摘要:1 //SPFA,邻接表存储,参数分别是:边数组,索引数组,源点,保存结果数组,总节点数 2 //返回true表示找到最短路,false表示有负环 3 void addedge(EDGE *edge,int* idx,int a,int b,int d,int totedge) 4 { 5 edge[totedge].to = b; edge[totedge].dis = d; edge[totedge].next= idx[a]; idx[a] = totedge; 6 } 7 struct EDGE 8 { 9 int to,dis,next;10 }edge1[M...
阅读全文
POJ 1985 Cow Marathon (树的直径) 模板
摘要:树的直径题目。两次BFS//9186307 NKHelloWorld 1985 Accepted 1824K 141MS C++ 1490B 2011-08-18 10:56:49//9186317 NKHelloWorld 1985 Accepted 1824K 110MS C++ 1565B 2011-08-18 10:57:21//9186348 NKHelloWorld 1985 Accepted 1888K 141MS G++ 1644B 2011-08-18 10:59:14#include <cstdio>#include <cstring>#define
阅读全文
POJ 1383 Labyrinth (树的直径)
摘要:求树的直径树的直径是指树的最长简单路。求法: 两遍BFS :先任选一个起点BFS找到最长路的终点,再从终点进行BFS,则第二次BFS找到的最长路即为树的直径;原理: 设起点为u,第一次BFS找到的终点v一定是树的直径的一个端点证明: 1) 如果u 是直径上的点,则v显然是直径的终点(因为如果v不是的话,则必定存在另一个点w使得u到w的距离更长,则于BFS找到了v矛盾)2) 如果u不是直径上的点,则u到v必然于树的直径相交(反证),那么交点到v 必然就是直径的后半段了所以v一定是直径的一个端点,所以从v进行BFS得到的一定是直径长度(引用http://beyrens.blog.163.com/b
阅读全文
POJ 1201 Intervals (差分约束)
摘要:POJ1716的变形,数据规模增大,用了循环数组。//9063355 NKHelloWorld 1201 Accepted 30788K 469MS C++ 1825B 2011-08-02 19:12:01#include <cstdio>using namespace std;int n,maxb = 0,dis[51000];struct EDGE{ int from,to,d;};EDGE edge[51000][50];int pedge[51000];int spfa(int s){ int i,a,b,d; bool inque[51000]; int que[510
阅读全文
POJ 1716 Integer Intervals (差分约束)
摘要:参照网上的约束条件,设d[i]为[0,i)区间内需要取的元素个数,则条件有:对于每个[ai,bi],d[bi]-d[ai-1] >=2; 0=<d[i]-d[i-1]<=1,d[0]=0;当全部归为>=时求最长路,<=时求最短路。本题可以以0为源点求最短路,原因我还没理解。为保险起见,也是我的习惯,设置一个超级源点,到每个点都有一条边,权值为0.结果这样做时间反而比直接以0为源点还要快200ms,至今无法解释。。。第一个版本用vector和queue写的,时间都在900+,甚至有一次幸运的卡在了1000ms。改掉queue,时间基本不变,改掉vector,时间瞬间
阅读全文
POJ 2387 Til the Cows Come Home (单源最短路SPFA解法)
摘要:单源最短路问题,SPFA解法//9050848 NKHelloWorld 2387 Accepted 272K 63MS C++ 1194B 2011-08-01 14:19:20//9050982 NKHelloWorld 2387 Accepted 276K 63MS C++ 1559B 2011-08-01 14:30:19//9050987 NKHelloWorld 2387 Accepted 680K 47MS G++ 1638B 2011-08-01 14:30:41//1A µÚÒ»µÀSPFA#include <
阅读全文
POJ 3259 Wormholes (Bellman-Ford 求负环)
摘要:本题可抽象为:给出一些点和边,边分为两种,一种为双向边,权值为正,一种为单向边,权值为负。要求给定一个图,判断图中是否有负环。很显然,需要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[
阅读全文
POJ 1932 XYZZY floyed+Bellman-Ford解法
摘要:本题题目名字跟题目关系貌似不大,或者是因为我没看懂第一段。本题是说有最多100个room,每个room有一个值,从1号room、100体力值开始,通过某种路径走到n号room,每到一个房间就加上或减去相应的体力值。要求过程中体力值不能小于0 。等于0的临界情况是否算die不清楚。。。两种理解都可以过。因为存在可以通过转圈来积攒体力,即存在环,所以单独的floyed和迪杰斯特拉无法求解,需用Bellman-Ford来对付,但是在松弛过程中又需要保证松弛的点最终是可以到达终点的,即“如果存在环,那么终点应该在环中”。所以先用floyed来判断各个点是否能通向终点,松弛过程中只对能到达终点的点进行松
阅读全文
POJ 2240 Arbitrage (floyed) .cpp
摘要:#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
阅读全文
POJ 1860 Currency Exchange (Bellman-Ford)
摘要:最短路径学了几种算法,但是一直没有学这个Bellman-Ford算法,因为在求最短路径的时候复杂度较高,不如某D氏算法。但是在求解一些特定问题的时候,他能判断是否存在回路这一特性能发挥很好的最用。例如对于POJ1860,这题英文描述比较NC,看了discuss之后才敢确定自己理解的是正确的。这题是可以多次经过同一种货币的。因此,当求出最长路后,除了是s点的dis大于v的情况是YES外,如果有正回路存在,也是可以达到目的的。这其中由一个玄机是虽然图是单向图,但是题目保证A->B可行时B->A也一定存在。这就是只要存在正回路就能达到目的的原因。//9042312 NKHelloWorl
阅读全文
浙公网安备 33010602011771号