数据结构和算法
Genius9_9
哎哟喂 无以伦比天才小九九
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
POJ2001 -- 字典树和字符串的前缀
该题和POJ2503一样,采用字典树。思维大同小异。直接附上源码。#include #include typedef struct trie{ int count; struct trie* next[26];}trie;trie* root;char output[21];char input[1000][21] ;trie* createNode(){原创 2015-05-31 16:10:15 · 608 阅读 · 0 评论 -
POJ2182 -- 线段树
一。线段树线段树类似于区间树,它在每个节点之间保存一个区间:[a,b] , 那它左儿子保存的区间是:[a, (a+b)/2] ,右儿子保存的区间是:[(a+b)/2 +1 , b ]。假设,父节点的标号为k, 那么左儿子的标号是2*k,右儿子的标号是2*k +1 .假设,此时需要保存1-5的区间, 那么子节点的个数为5, 而线段树需要的空间约为3*5 =15个,即数组大小的3倍左右。原创 2015-06-15 11:18:07 · 765 阅读 · 0 评论 -
POJ1797 -- Dijkstra算法
先大致解释一下题意, 求得是从街道1出发,到街道n,可以运输的最大重量。该题用的是Dijkstra算法。大致思路如下:int Graph[1001][1001]; //街道i到街道j的重量int flag[1001]; //标记是否访问过int Dis[1001]; //点1到每个点的最大重量1.定义了三个数组2.求得距离街道1最大重量的那个街道。此时是街道3,Dis原创 2015-06-09 16:06:24 · 512 阅读 · 0 评论 -
POJ1125 -- Floyed算法
该题求的是,从哪一个股票经纪人出发,可以最快的将消息传递。 1.用Floyed算法求出,任何俩个股票经纪人之间传递消息的最小时间。Floyed算法其实就是三个for循环:假设如何俩个点之间都经过i点进行中转。 for(i=1;i<=N;i++){ //所有的点都经过i点中转 for(j=1;j<=N;j++){ //遍历所有点,途经原创 2015-06-09 16:41:43 · 731 阅读 · 0 评论 -
POJ2488 -- POJ1154-- DFS
该题用到了很基础的DFS。 1. 理解清楚题意,什么叫字典序。图中红色数字1/2/3....7/8是马可以行走到的位置,按照字典序行走,也就是按12345678的顺序依次行走。 2.在该题的DFS算法中,可以尝试八种走法,如果其中一条路不通,则需要尝试其他的路径。因此可以用for循环8次,或者8个if语句。在这里设立了一个标志位flag,如果完成了,则置1,否则说明是i原创 2015-06-04 19:10:13 · 771 阅读 · 0 评论 -
memset方法
void *memset(void *s, int ch, size_t n);将s中的前n个字节用ch替换。 一。 memset的方法初始化数组,是设置每个字节的值.所以如果对int型数组进行初始化,会出错. 但是如果初始化为0,是可以的。 int intArr[100]; memset(intArr,1,sizeof(intArr));原创 2015-06-05 11:28:06 · 614 阅读 · 0 评论 -
POJ3083 -- BFS和DFS
这个题目就是考了图的BFS和DFS。BFS用于求最短路径,这个非常简单。 DFS用于求左优先和右优先的路径,难点在于它的下一步方向是由上一步的方向确定的,因此每一步我们都需要确定当前的正方向。 一.在这里,我们定义了一个数据类型,用于存放迷宫中点的坐标以及当前行走的步数。typedef struct Data{ int row; int col; int s原创 2015-06-04 11:26:28 · 724 阅读 · 0 评论 -
POJ1700 -- 贪心算法
一。贪心策略:用最少的时间过河 二。过河方法分析:有俩种方法将最慢的那俩个人送过河。eg:1 2 5 10方法1:每次最快的1和次快的2过河,然后最快的1回来,最慢的10和次慢的5过河,最快的2再回来。 此时花费的时间为method1:2+1+10+2;公式为:a[0]+2*a[1]+a[i] (备注:数组a[ ]是从小到大有序排列 )方法2:每原创 2015-06-03 13:34:03 · 629 阅读 · 0 评论 -
POJ1328 -- 贪心算法和快速排序
一 。贪心策略:将雷达放置在合适的地方,使得包含的岛屿数量最多。二。具体分析我们采用从左到右放置雷达。假设左边第一个岛屿是A(Xa,Ya),从左到右的岛屿依次是A B C ....我们可以计算出岛屿A的雷达区间 : [Xa_left,Xa_right] , 使得在这个区间的雷达都可以覆盖到岛屿A。Xa_left = Xa - sqrt (d^2 - Ya^2) ; Xa_right原创 2015-06-02 15:31:27 · 2782 阅读 · 0 评论 -
POJ1753 -- BFS和位运算
该题俩个考点,一个是BFS广度优先遍历,另外一个是通过位的运算。 一。位运算1.将输入的“0001 1001 1011 1001”字符串转换为十进制数6585,在这里是通过将输入的‘0’或‘1’进行位的左移运算实现。代码如下: for(i=0;i<4;i++){ scanf("%s",str); for(j=0;j<4;j++){原创 2015-06-01 15:59:23 · 694 阅读 · 0 评论 -
POJ2503 -- 字典树
该题的主要注意点,一是输入,二是字典树的考察。一。输入Sample Inputdog ogdaycat atcaypig igpayfroot ootfrayloops oopslayatcayittenkayoopslay1.首先,用了scanf("%s%s",eng,fori)!=EOF判断是不是到文件结尾, 如果输入到最后一个单词oopslay,则说明原创 2015-05-31 10:14:26 · 757 阅读 · 0 评论 -
POJ2395 -- Prim算法
一。Prim算法和Dijkstra算法1. Prim算法: 最小生成树,主要用于,N个村庄修路,怎么样成本最低。2.Dijkstra算法:最短路径计算,主要用于,任何一个点到点1的最短距离。区别:Prim算法和Dijkstra算法在代码实现上,几乎一样,唯一有个区别在于:Prim: Graph[k][j] Dijkstra: min+Graph[k][j]原创 2015-06-15 16:52:06 · 735 阅读 · 0 评论 -
POJ3278 -- BFS
这是一道非常简单的BFS。在这里需要注意的是,要对数据进行剪枝,否则会浪费时间。我们来看一下BFS的具体实现:int BFS(int Person, int cow){ que* q = (que*)malloc(sizeof(que)); initQue(q); enQ(q,Person); count[Person]=0; while(q->fr原创 2015-06-02 10:18:03 · 642 阅读 · 0 评论
分享