POJ3159 Candies(差分约束)
摘要:题目链接。分析:这题很简单。就是差分约束。d[B]-d[A]<=C。不过在用spfa提交时一直TLE。不明白为什么,一查才知道这题要用栈(据说栈有时会比队列快?)。。虽说AC了。但总觉得。莫名其妙。思考一番,应该是对spfa的优化不是很了解。再者,听说用dijkstra+heap一般不会被卡住,所以我决定要开始学习堆、以及spfa的各种优化了。。加油。加油!!!#include <cstdio>#include <stack>using namespace std;#define MAXN 30010#define MAXM 150010const int INF
阅读全文
posted @
2013-02-28 21:56
Still_Raining
阅读(507)
推荐(0)
POJ3169 Layout(差分约束)
摘要:题目链接。分析:对于任意i号奶牛,1<=i<N,在距离上应该满足:D[i+1] - D[i] >= 0对于每个好感的描述(i,j,k),假设i<=j,体现到距离上的要求就是:D[j] - D[i] <= k对于每个反感的描述(i,j,k),假设i<=j,体现到距离上的要求就是:D[j] - D[i] >= k写成我们约定的形式:D[i] - D[i+1] <= 0D[j] -D[i ]<= kD[i] - D[j] <= - k1.对于差分不等式,a - b <= c ,建一条 b 到 a 的权值为 c 的边,求的是最短路,得到
阅读全文
posted @
2013-02-27 20:21
Still_Raining
阅读(2179)
推荐(0)
POJ3259 Wormholes(最短路)
摘要:题目链接。分析:本题的关键的关键是——看懂题。。。本质就是求该图是否存在负环。也就是如何求出一个图是否含有负环。要注意的是输入该题中的path是双向的,wormhole是单向的。Bellman_Ford:View Code 1 #include <stdio.h> 2 3 #define MAXN 520 4 #define MAXM 6000 5 6 const int INF = (1<<26); 7 8 struct node{ 9 int u, v, w;10 }edge[MAXM];11 12 int dis[MAXN], top;13 14 int bell
阅读全文
posted @
2013-02-27 20:01
Still_Raining
阅读(2220)
推荐(0)
HDU1874 畅通工程续(最短路)
摘要:题目链接。分析:本题只要考虑重边的问题,基本上就没其它问题了。#include <stdio.h>#define MAXN 202const int INF = (1<<26);int dis[MAXN], G[MAXN][MAXN], vis[MAXN];void Init(int n){ int i, j; for(i=0; i<n; i++){ vis[i] = 0; } for(i=0; i<n; i++){ for(j=0; j<n; j++){ G[i][j] = INF; } }}voi...
阅读全文
posted @
2013-02-27 19:53
Still_Raining
阅读(190)
推荐(0)
HDU2647 Reward(拓扑排序)
摘要:题目链接。分析:我使用结构的是边表。1.因为只有满足偏序关系才能应用拓扑排序(即u>v要改成v<=u),所以在建立临边时要注意。2.在拓扑排序过程中,如果发现环,那么结果便是No。3.至于每个点的具体值,我用了一个一维数组vis来辅助标记。AC代码如下:#include <stdio.h>#include <string.h>#define MAXN 10010#define MAXM 20010struct node{ int to; int next;}node[MAXM];int head[MAXN], top, n, m, indegree[MAXN
阅读全文
posted @
2013-02-26 21:17
Still_Raining
阅读(266)
推荐(0)
HDU2094 产生冠军(拓扑排序)
摘要:题目连接。分析:想了很多很多。全部WA了。。没想到是找入度为0的点。。如果个数为1个Yes,否则No。。(因为这题仅仅是找冠军而已)#include <stdio.h>#include <string.h>#define MAXN 1005int n, top_name, indegree[MAXN];char name[MAXN][15];void Init(){ top_name = 0; memset(indegree, 0, sizeof(indegree));}int find_str(char *s){ int i; for(i=0; i<top_na
阅读全文
posted @
2013-02-26 21:01
Still_Raining
阅读(918)
推荐(0)
HDU1010 Tempter of the Bone(搜索,dfs)
摘要:题目链接。分析:首先,感慨一下。。我竟然做出来了一个难度为2的(第一次)。。感谢CCTV。这题呢。。直接DFS就可以了。不过不剪枝的话TLE。第一种剪枝是如果所有可走的点的总和也小于T直接输出NO。这一种剪枝可以从TLE到843ms第二种是从课件上学的奇偶性剪枝可以从TLE到 453ms最后把两种方法合并。竟然达到了62ms(掌声响起。。)奇偶性剪枝。如下图所说。62ms AC代码如下;#include <stdio.h>#include <string.h>#include <math.h>#include <stdlib.h>#define
阅读全文
posted @
2013-02-25 21:32
Still_Raining
阅读(228)
推荐(0)
HDU2141 Can you find it?(搜索,二分)
摘要:题目链接。分析:一看这题还以为是暴搜呢。果断TLE。第二次将三个数组合并,二分查找,MLE。最后将两个两个数组合并,二分查找 AC。。。不容易啊。AC代码如下:#include <stdio.h>#include <stdlib.h>#define MAXN 510int l, m, n;int num1[MAXN], num2[MAXN], num3[MAXN], num4[MAXN*MAXN];int cmp(const void *a, const void *b){ return *(int *)a - *(int *)b;}int main(){ int fl
阅读全文
posted @
2013-02-25 17:34
Still_Raining
阅读(161)
推荐(0)
HDU1016 Prime Ring Problem(搜索,DFS)
摘要:题目链接。分析:先求出素数表。再DFS。#include <stdio.h>#include <string.h>#define MAXN 21int isp[MAXN+MAXN], num[MAXN], n, vis[MAXN], cnt;void prime(){ int i, j; memset(isp, -1, sizeof(isp)); isp[0] = isp[1] = 0; for(i=2; i<=MAXN+MAXN; i++){ if(isp[i]) for(j=i*i; j<=MAXN+MAXN; j += i) ...
阅读全文
posted @
2013-02-25 17:26
Still_Raining
阅读(176)
推荐(0)
HDU1253 胜利大逃亡(搜索)
摘要:题目链接。这题就是BFS。也挺水的。。看见这个时间差了吗。。很可惜。这并不是减枝。。只是同样的代码,用不同的编译器发罢了(汗。)。#include <stdio.h>#define MAXN 52typedef struct Pos{ int x, y, z; int cur;}Pos;int a, b, c;int G[MAXN][MAXN][MAXN], vis[MAXN][MAXN][MAXN];Pos queue[MAXN*MAXN*MAXN];int dx[] = {0, 0, 0, 0, 1, -1};int dy[] = {0, 0, 1, -1, 0, 0};int
阅读全文
posted @
2013-02-25 17:19
Still_Raining
阅读(287)
推荐(0)
HDU1312 Red and Black(搜索)
摘要:题目链接。分析:水题,直接BFS或者DFS。dfs:#include <stdio.h>#include <stdlib.h>#include <string.h>#define MAXN 22char G[MAXN][MAXN];int vis[MAXN][MAXN], cnt, m, n;int dx[4] = {0, 0, 1, -1};int dy[4] = {1, -1, 0, 0};void dfs(int x, int y){ int d; for(d=0; d<4; d++){ int nx = x+dx[d], ny = y+dy[d
阅读全文
posted @
2013-02-25 16:37
Still_Raining
阅读(493)
推荐(0)
HDU1723 Distribute Message(dp)
摘要:题目链接。分析:水题,简单DP。经过这么几天的努力,回头再看这些曾经被认为是“难题”的题, 确实感觉到了自己的进步。。但,进步永不会停止。#include <stdio.h>#include <stdlib.h>#include <string.h>#define MAXN 35int dp[MAXN];int main(){ int n, m, i, j; while(scanf("%d %d", &n, &m) == 2 && (n != 0 || m != 0)){ memset(dp, 0, siz
阅读全文
posted @
2013-02-24 16:25
Still_Raining
阅读(193)
推荐(0)
POJ2230 Watchcow(欧拉回路)
摘要:题目链接。分析:n个点,m条边,每条边仅且经过两次,输出路径。题目保证了必然存在一条这样的边,那么直接dfs搜索,搜索的时候把next标记下就可以了。不过虽然参考别人的过了,还是遇到很多问题,要仔细琢磨琢磨了。#include <stdio.h>#define MAXN 10010#define MAXM 100010struct node{ int to; int next;}edge[MAXM];int head[MAXN], t, vis[MAXM];void Init(int n, int m){ int i; t = 0; for(i=1; i<=n; ...
阅读全文
posted @
2013-02-24 10:46
Still_Raining
阅读(212)
推荐(0)
POJ1386Play on Words(欧拉回路)
摘要:题目地址。分析:1.图必须是连通的。2.欧拉道路或者是欧拉回路都是可以的。#include <stdio.h>#include <stdlib.h>#include <string.h>#define MAXN 27int hash[MAXN], in[MAXN], out[MAXN], p[MAXN];void Init(){ int i; for(i=0; i<MAXN; i++){ hash[i] = in[i] = out[i] = 0; p[i] = i; }}int find(int x){return p[x] == x ? x : ..
阅读全文
posted @
2013-02-23 20:35
Still_Raining
阅读(310)
推荐(0)
HDU3018Ant Trip(欧拉回路)
摘要:题目地址。解题报告:欧拉回路:图G,若存在一条路,经过G中每条边有且仅有一次,称这条路为欧拉路,如果存在一条回路经过G每条边有且仅有一次,称这条回路为欧拉回路。具有欧拉回路的图成为欧拉图。判断欧拉路是否存在的方法有向图:图连通,有一个顶点出度大入度1,有一个顶点入度大出度1,其余都是出度=入度。无向图:图连通,只有两个顶点是奇数度,其余都是偶数度的。判断欧拉回路是否存在的方法有向图:图连通,所有的顶点出度=入度。无向图:图连通,所有顶点都是偶数度。本题呢。先用并查集查看共有几棵树, 记录下每棵树中度为奇数的点的个数。 如果该树中度为奇数的点的个数为0, 且代表元的度为0,证明该点为孤立的点,按
阅读全文
posted @
2013-02-22 21:35
Still_Raining
阅读(275)
推荐(0)
图的三种存储方式
摘要:之前总结过一次。详见本博客或者是另一篇。不过呢。写起来。还是今天的简单易写(学长教的)。测试数据my.txt.邻接矩阵:#include <stdio.h>#include <stdlib.h>#include <string.h>#define MAXN 100const int INF = (1<<23);int G[MAXN][MAXN];int main(){ //freopen("d:\\my.txt", "r", stdin); int n, m, i, j, u, v, w; scanf(&q
阅读全文
posted @
2013-02-22 10:37
Still_Raining
阅读(1277)
推荐(0)
辗转相除法证明
摘要:摘自百度百科:设两数为a、b(b<a),用gcd(a,b)表示a,b的最大公约数,r=a mod b 为a除以b以后的余数,k为a除以b的商,即a÷b=k.......r。辗转相除法即是要证明gcd(a,b)=gcd(b,r)。第一步:令c=gcd(a,b),则设a=mc,b=nc第二步:根据前提可知r =a-kb=mc-knc=(m-kn)c第三步:根据第二步结果可知c也是r的因数第四步:可以断定m-kn与n互素【否则,可设m-kn=xd,n=yd,(d>1),则m=kn+xd=kyd+xd=(ky+x)d,则a=mc=(ky+x)dc,b=nc=ycd,故a与b最大公
阅读全文
posted @
2013-02-22 08:37
Still_Raining
阅读(266)
推荐(0)
HDU1272 小希的迷宫(并查集)
摘要:题目链接。解题报告:首先1.题目上说的房间的编号至少为1,也就是说,当输入只0 0时,要输出Yes。2.在连通两个房间时,如果发现已经间接地连通了,那么结果便是No.3.要保证给出的所有房间之间都必须连通,否则便是No。View Code #include <stdio.h>#include <stdlib.h>#include <string.h>#define MAXN 100010int p[MAXN], ans, v[MAXN], n, flag;void Init(){ n = 0; flag = 1; ans = 0; memset(v, 0,
阅读全文
posted @
2013-02-21 14:18
Still_Raining
阅读(200)
推荐(0)
POJ2524Ubiquitous Religions, 1611The Suspects(并查集)
摘要:POJ2524 Ubiquitous ReligionsPOJ1611 The Suspects解题报告:这两个题差不多。就一块发了。。就是赤裸裸的并查集POJ2524Ubiquitous Religions代码如下:View Code #include <stdio.h>#include <stdlib.h>#define MAXN 50010int p[MAXN];int icount;int find_f(int x){return p[x] == x ? x : (p[x]=find_f(p[x]));}int main(){ int n, m, i, a, b
阅读全文
posted @
2013-02-21 14:10
Still_Raining
阅读(187)
推荐(0)
HDU1247Hat’s Words(字典树)
摘要:题目链接。解题报告:静态分配是比动态分配省时的。静态分配耗时:动态分配耗时:#include <stdio.h>#include <stdlib.h>#include <string.h>#define MAXN 26typedef struct TrieNode{ int flag; struct TrieNode *next[MAXN];}TrieNode;TrieNode mem[500000];int pn;TrieNode *CreateTrieNode(){ TrieNode *p; int i; p = &mem[pn++]; p-&g
阅读全文
posted @
2013-02-20 21:12
Still_Raining
阅读(342)
推荐(0)
HDU1305Immediate Decodability(字典树)
摘要:题目链接。解题报告:现在假定两个字符串A,B。 A的长度小于B。分两种情况,当B先输入时(即长的先输入),途经的结点的flag如果为1,即如果有小于B的单词,便为前缀。当A先输入时(即短的先输入),当建立到A的最后一个字符时, 如果该结点已存在,那么证明,已有一个以该字符为前缀的字符已经输入。#include <stdio.h>#include <stdlib.h>#include <string.h>#define MAXN 2typedef struct TrieNode{ int flag; struct TrieNode *next[MAXN];}T
阅读全文
posted @
2013-02-20 20:59
Still_Raining
阅读(429)
推荐(0)
SDUT1500Message Flood(字典树)
摘要:题目链接。结题报告:模板题。我用的动态分配内存。。每一组数据操作完都要释放内存。。否则的话。会Memory Limit Exceeded的。#include <stdio.h>#include <stdlib.h>#define MAXN 26typedef struct TrieNode{ int flag; struct TrieNode *next[MAXN];}TrieNode;TrieNode *CreateTrieNode(){ TrieNode *p; int i; p = (TrieNode *)malloc(sizeof(TrieNode)); ...
阅读全文
posted @
2013-02-20 09:51
Still_Raining
阅读(242)
推荐(0)
树专题(集训)
摘要:数据结构上机测试4.1:二叉树的遍历与应用1View Code #include <stdio.h> #include <stdlib.h> #include <string.h> #define MAXN 200 void build(int n, char *s1, char *s2, char *s){ if(n<=0) return; int p = strchr(s2, s1[0]) - s2; build(p, s1+1, s2, s); build(n-p-1, s1+p+1, s2+p+1, s+p); s[n-...
阅读全文
posted @
2013-02-19 15:13
Still_Raining
阅读(209)
推荐(0)
树的中序遍历(非递归)
摘要:第一种:Tree q[MAXN];void InOrderTraverse(Tree T){ int top = 0; Tree p = T; while(p || top != 0){ if(p) {q[top++] = p; p = p->lchild;}//根指针进栈,遍历左子树 else{ //根指针退栈,访问根结点,遍历右子树 p = q[--top]; printf("%c", p->data); p = p->rchild; } }}第二种:Tr...
阅读全文
posted @
2013-02-19 15:08
Still_Raining
阅读(189)
推荐(0)
SDUT2132算术表达式转换成后缀式(表达式树)
摘要:题目链接。解题报告:这是很久前做的了。。又扒出来了。。怕再忘了嘛。。很简单。建立表达式树,然后后序遍历。代码如下:#include <stdio.h> #include <stdlib.h> #include <string.h> #include <ctype.h> #define MAXN 200 int comp(char a, char b); int st1[MAXN], st2[MAXN]; int main(){ int top1 = 0, top2 = 0, i=0; char s[MAXN]; scanf("%s&qu
阅读全文
posted @
2013-02-19 09:33
Still_Raining
阅读(505)
推荐(0)
HDU1162Eddy's picture(最小生成树)
摘要:题目链接。解题报告:用了两个方法。。一个是Kruskal, 一个是prim。对于本题。。还是prim写起来容易点。。Kruskal:prim:。。直接上代码Kruskal AC代码:#include <stdio.h>#include <stdlib.h>#include <math.h>#define MAXN 100typedef struct Pointer{ double x, y;}Pointer;struct Num{ int x, y; double dis;}num[MAXN*(MAXN-1)/2];Pointer pos[MAXN];int
阅读全文
posted @
2013-02-15 20:24
Still_Raining
阅读(213)
推荐(0)
HDU1102Constructing Roads(最小生成树, Kruskal)
摘要:题目链接。解题报告:就是Kruskal就行了。。不过WA了很多次。第一个致命错误是。。数据会有很多组(无语了)。。第二个错误是。。for(i=0; i<q; i++){ scanf("%d %d", &a, &b); int x = find(a), y = find(b); p[x] = y;}错写成了for(i=0; i<q; i++){ scanf("%d %d", &a, &b); p[a] = b;}只能说对于并查集理解的并不是十分透彻。。例如,对于1 2, 1 3这两组数据, 操作p[1] = 2,
阅读全文
posted @
2013-02-14 22:00
Still_Raining
阅读(169)
推荐(0)
HDU3342Legal or Not(拓扑)
摘要:题目链接。解题报告:拓扑水题一道。1.DFS检测是否有环。#include <stdio.h>#include <string.h>#define MAXN 110int G[MAXN][MAXN], v[MAXN];int n, m;int dfs(int u){ v[u] = -1; int i; for(i=0; i<n; i++)if(G[u][i]){ if(v[i] < 0) return 0; if(!v[i] && !dfs(i)) return 0; } v[u] = 1; return 1;}int topos...
阅读全文
posted @
2013-02-14 17:21
Still_Raining
阅读(220)
推荐(0)
HDU1285确定比赛名次(拓扑排序)
摘要:题目链接解题报告:这题小意思。。啦 啦啦#include <stdio.h>#include <string.h>#define MAXN 600int n, m, indegree[MAXN], G[MAXN][MAXN], q[MAXN];int toposort(){ int i, j, k; i=0; while(i<n){ for(j=1; j<=n; j++){ if(indegree[j] == 0){ indegree[j]--; q[i++] = j; ...
阅读全文
posted @
2013-02-14 16:05
Still_Raining
阅读(1088)
推荐(0)
拓扑排序
摘要:#include <stdio.h>#include <stdlib.h>#include <string.h>#define MAXN 91int v[MAXN], n, t, q[MAXN], G[MAXN][MAXN];int dfs(int i){ v[i] = -1; int j; for(j=1; j<=n; j++) if(G[i][j]){ if(v[j]<0) return 0; //发现环 if(!v[j] && !dfs(j)) return 0; } q[t--] = i; v[i] = 1; //加到..
阅读全文
posted @
2013-02-14 13:12
Still_Raining
阅读(191)
推荐(0)
HDU1069Monkey and Banana(DP)
摘要:题目连接解题报告:各种错误,各种纠正。。自我感觉对DP的理解入门些了。第一种思路是从i结点出发所能达到的最大高度,状态转移方程为dp[i] = dim[i]+max{dp[j]}, 其中G[i][j]=1,即j能放在i上。AC代码如下:View Code #include <stdio.h>#include <stdlib.h>#include <string.h>#define MAXN 91struct{ int x, y, z;}dim[MAXN*3];int dp[MAXN], G[MAXN][MAXN], _index;void _swap(int
阅读全文
posted @
2013-02-12 23:40
Still_Raining
阅读(164)
推荐(0)
HDU2602Bone Collector(DP,0/1背包)
摘要:题目连接解题报告:结合算法竞赛入门经典(刘汝佳), 算法设计与分析(郑宗汉,郑晓明)花了一天才算弄懂0/1背包思想,当然仅仅是入门而已给定一个载重量为M, n个重量为wi,价值为pi的物体,1<=i<=n, 每个物品xi都有两种状态,即放入(0)和不放入(1),即xi=0或xi=1使得价值最大。状态转移方程为f[i][j]=max{f[i-1][j],f[i-1][v-w[i]]+p[i]}一篇博客介绍的相当不错。(里面介绍的思路(设的变量名称可能会不一样):问题的特点是:每种物品一件,可以选择放1或不放0。用子问题定义状态:即f[i][v]表示前i件物品恰放入一个容量为v的背包可
阅读全文
posted @
2013-02-11 22:35
Still_Raining
阅读(322)
推荐(1)
HDU1257最少拦截系统
摘要:题目连接(点我查看).琢磨了一天。。竟然有人说这是水题。。解题报告:首先要弄懂最长上升子序列,可以看下征南同学的博客(点击链接)。本题呢。例如对于6 7 5 1 3 2 4先将7放入数组【0】, 然后看5,因为5<=7,更新数组, 数组[0] = 5,接着看剩下的1,3,2。用1更新【0】,然后3>1,所以放在【1】中,2更新【1】,4>1,4>2,4放在【2】,这样呢。就需要2+1套拦截系统。该思路代码如下。#include <iostream> #include <cstdlib> #include <cstdio> #inclu
阅读全文
posted @
2013-02-10 19:57
Still_Raining
阅读(181)
推荐(0)
HDU1176免费馅饼(DP)
摘要:跳到原题解题报告:首先这题相当于数字三角形。相当于从(0,5)出发,求到达底端的最大值(i, 0) , (i, 10)这两个端点是要注意的,因为(i,0)只能到达(i+1, 0) 和 (i+1, 1), 而(i, 10)只能到达(i+1, 9), (i+1, 10)#include <stdio.h>#include <string.h>#define MAXN 100010int dp[MAXN][12];int max_num(int a, int b, int c){ a = a > b ? a : b; a = a > c ? a : c; retu
阅读全文
posted @
2013-02-08 23:10
Still_Raining
阅读(195)
推荐(0)
HDU1058Humble Numbers(DP)
摘要:转到题目。解题分析:既然让求因子只能为2357的数, 那么分别看2357的倍数就OK了。另外。输出时要注意st(first), nd(secend), rd(third)因为11,12,13时为th 所以111和101也是不同的代码如下:#include <stdio.h>#define n 5900int hum[n];int min_num(int a, int b, int c, int d){ int t = a; if(t>b) t = b; if(t>c) t = c; if(t>d) t = d; return t;}int main(){ i...
阅读全文
posted @
2013-02-08 15:56
Still_Raining
阅读(262)
推荐(0)
DAG上的动态规划
摘要:注意:这里的d(i)表示从节点i出发的最长路长度d(i) = max{d(j)+1|(i,j)∈ E}, E 为边集#include <stdio.h>#include <limits.h>#include <string.h>#define MAXN 102int u[MAXN], v[MAXN], w[MAXN][MAXN], d[MAXN];int n;int dp(int i){ if(d[i] > 0) return d[i]; d[i] = 1; int j; for(j=1; j<=n; j++){ if(w[i][j]) d[i]
阅读全文
posted @
2013-02-08 11:22
Still_Raining
阅读(802)
推荐(0)
最近新学算法总结
摘要:最小生成树:1.Kruskal算法(同时包含并查集)2.prim算法最短路径问题: 1.Dijkstra(迪杰斯特拉):适用于权值为非负的图的单源最短路径。可用于计算正权图上的单源最短路(Single-Source Shortest Paths, SSSP),即从单个源点出发,到所有结点的最短路,该算法同时适用于有向图和无向图。 2.Bellman-Ford(贝尔曼-福特):适用于权值有负值的图的单源最短路径。前提条件为不含负环。既然不含环, 最短路最多进过(起点不算)n-1个结点,通过n-1轮松弛操作(relaxation)得到。 3.spfa算法(Shortest Path Fast...
阅读全文
posted @
2013-02-05 15:48
Still_Raining
阅读(191)
推荐(0)
HDU1869六度分离(最短路floyd)
摘要:题目链接。分析:只要将互相认识的人之间的权值赋值为1,并用Floyd算法然后检查任意两人间的最短路是否大于7即可#include <stdio.h>#include <string.h>#define MAXN 110const int INF = (1<<28);int w[MAXN][MAXN], d[MAXN][MAXN];void Floyd(int n){ int i, j, k; for(i=0; i<n; i++){ for(j=0; j<n; j++){ if(w[i][j] != INF) d[i][j] = w[i][j];.
阅读全文
posted @
2013-02-05 15:13
Still_Raining
阅读(196)
推荐(0)
HDU2066一个人的旅行(最短路Dijkstra(枚举), Floyd)
摘要:一个人的旅行Problem Description虽然草儿是个路痴(就是在杭电待了一年多,居然还会在校园里迷路的人,汗~),但是草儿仍然很喜欢旅行,因为在旅途中 会遇见很多人(白马王子,^0^),很多事,还能丰富自己的阅历,还可以看美丽的风景……草儿想去很多地方,她想要去东京铁塔看夜景,去威尼斯看电影,去阳明山上看海芋,去纽约纯粹看雪景,去巴黎喝咖啡写信,去北京探望孟姜女……眼看寒假就快到了,这么一大段时间,可不能浪费啊,一定要给自己好好的放个假,可是也不能荒废了训练啊,所以草儿决定在要在最短的时间去一个自己想去的地方!因为草儿的家在一个小镇上,没有火车经过,所以她只能去邻近的城市坐火车(好可
阅读全文
posted @
2013-02-05 12:07
Still_Raining
阅读(398)
推荐(0)
Bellman-Ford算法
摘要://Bellman-Ford算法(含有负权的最短路径问题)#include <stdio.h>#define MAXM 100#define MAXN 10const int INF = 1<<20;int u[MAXM], v[MAXM], w[MAXM];int d[MAXN];int Bellman_Ford(int v0, int n, int m){ int i, k; for(i=0; i<n; i++) d[i] = INF; d[v0] = 0; for(k=0; k<n-1; k++){ for(i=0; i<m; i++){ ...
阅读全文
posted @
2013-02-03 17:22
Still_Raining
阅读(222)
推荐(0)
2012寒假假期计划
摘要:学会解决最小生成树(已学),最短路径问题(已学)以及拓扑排序(已学2013-02-1416:11:44),背包问题(已学)。(很好很好。以后就这样来。。2013-02-1416:12:07)
阅读全文
posted @
2013-02-03 12:28
Still_Raining
阅读(445)
推荐(0)
Dijkstra不能得到含有负权边图的单源最短路径
摘要:对于不含负权边的图求单源最短路径,Dijkstra算法是最高效的。但是在含负权边的图中,Dijkstra很可能得不到正确的结果,因为Dijkstra每次选的是当前能连到的边中权值最小的,在正权图中这种贪心是对的,但是在负权图中就不是这样了。比如1——>2权值为5,1——>3权值为6,3——>2权值为-2,求1到2的最短路径时,Dijkstra就会选择权为5的1——>2,但实际上1——>3——>2才是最优的结果。另外如果包含负环,则意味着最短路径不存在。因为只要在负权回路上不断兜圈子,所得的最短路长度可以任意小。
阅读全文
posted @
2013-02-03 12:09
Still_Raining
阅读(10353)
推荐(5)
prim
摘要:基本思想1. 在图G=(V, E) (V表示顶点 ,E表示边)中,从集合V中任取一个顶点(例如取顶点v0)放入集合 U中,这时 U={v0},集合T(E)为空。2. 从v0出发寻找与U中顶点相邻(另一顶点在V中)权值最小的边的另一顶点v1,并使v1加入U。即U={v0,v1 },同时将该边加入集合T(E)中。3. 重复2,直到U=V为止。这时T(E)中有n-1条边,T = (U, T(E))就是一棵最小生成树。#include <stdio.h>#define MAXN 100#define INF (1<<20)int v[MAXN], w[MAXN][MAXN],
阅读全文
posted @
2013-02-02 18:14
Still_Raining
阅读(303)
推荐(0)
HDU2544最短路(最短路 Dijkstra, spfa)
摘要:题目连接。解题:题中的起始点为0(假设元素从0开始),终止点为n-1Dijkstra:View Code //起始为0,终点为n-1#include <stdio.h>#include <limits.h>#include <string.h>#define MAXN 102#define INF (1<<20) //如果很小的话。是不能AC的。int v[MAXN], d[MAXN], w[MAXN][MAXN];void Dijkstra(int n){ memset(v, 0, sizeof(v)); int i, y; for(i=0;
阅读全文
posted @
2013-02-01 13:27
Still_Raining
阅读(289)
推荐(0)