
数据结构与算法
小爷永远不死
不走到最顶峰,就永远不知道世界有多大
展开
-
UVa 11045 - My T-shirt suits me(最大流)
题目转的有点远,不过如果对最大流问题比较熟悉的话也不难看出问题的本质。下面描述建图过程。1、设一个原点0,1到6为六种型号衣服对应的点,然后7到m+6是m个人对应的点,最后一个点m+7对应终结点。2、原点到型号点的容量为n/6(根据题意),一个人对应两种型号衣服,每条线的容量都是1(每个人对应两种衣服),最后每个人到终点的容量都为1(每个人只需要一件衣服)。这样图就建好了。#inc原创 2014-02-20 19:19:46 · 825 阅读 · 0 评论 -
UVa10158 War(并查集)
题目链接:UVa10158 War(并查集)这道题看着不难,也很明显是用并查集做,但是我自己写的代码一直是Runtime error,现在还是不知道为什么。网上找了一个题解,看了好长时间也没看懂。两份代码先都放这里吧,以后回头再看没准会懂。希望这样。我自己写的代码:#include #include #include using namespace std;const in原创 2014-02-21 23:43:28 · 526 阅读 · 0 评论 -
十个利用矩阵乘法解决的经典题目
原文地址: 十个利用矩阵乘法解决的经典问题">转自matrix67 十个利用矩阵乘法解决的经典问题作者:UsingTC十个利用矩阵乘法解决的经典题目 好像目前还没有这方面题目的总结。这几天连续看到四个问这类题目的人,今天在这里简单写一下。这里我们不介绍其它有关矩阵的知识,只介绍矩阵乘法和相关性质。 不要以为数学中的矩阵也是黑色屏幕上不断变化的绿色字符。在数学中,一个矩阵转载 2014-02-19 10:59:09 · 568 阅读 · 0 评论 -
UVa 10608 - Friends(并查集)
题目链接:UVa 10608 - Friends(并查集)并查集经常和最小生成树之类的题放在一起考察。不过这道题就是一个考察点:并查集。/**UVa 10608 - Friends并查集 模版题*/#include #include using namespace std;const int MAX_N = 30000 + 1000;int N,M;int x,y原创 2014-02-21 19:00:44 · 922 阅读 · 0 评论 -
UVa 146 - ID Codes
题目链接:UVa 146 - ID Codes一看这三位数的题号就知道应该是道基础、经典的题目。求下一个排列。说一下算法。1、从字串最后往前遍历,找到一个字符,要求是这个字符应该小于(字符的话应该是编码的小于)其后边紧跟着的那个字符,把这个字符的下标记录为i。2、再次从字串最后开始遍历,到i+1位置停止,找到一个比i处字符大的字符,停止,记录其下标为j。3、原创 2014-02-22 21:05:18 · 609 阅读 · 0 评论 -
UVa 10098 - Generating Fast
题目链接:UVa 10098 - Generating Fast跟上道题用同样的方法。记得先排下序就行了。#include #include #include using namespace std;const int MAX_N = 10 + 5;int T;char a[MAX_N];int len;int cmp(const void *a,const void *原创 2014-02-22 21:39:03 · 468 阅读 · 0 评论 -
最大流和费用流问题中使用反向弧的原因
刚开始看学最大流,根本没注意反向弧,后来做到最小费用最大流问题时候发现需要把反向弧的容量设置为0,费用设为原费用的相反数,这才发现反向弧还有一些东西没有注意到,然后又回过头专门学习了下最大流问题反向弧那块。下面是从网上找到两个例子,具体一下。eg1:6 71 2 102 4 104 6 101 3 103 5 105 6 102 5 10这样你会先拓原创 2014-02-21 11:14:13 · 4920 阅读 · 4 评论 -
UVa 216 - Getting in Line(回溯法)
题目链接:UVa 216 - Getting in Line挺简单的一道回溯题,可是我做了好久啊啊啊啊啊啊啊。还是不熟练啊啊啊啊啊。#include #include #include #include #include //#define testusing namespace std;const int MAX_N = 8 + 2;int vis[MAX_N];原创 2014-02-23 12:59:19 · 630 阅读 · 0 评论 -
UVa 11205 - The broken pedometer(求子集)
题目链接:UVa 11205 - The broken pedometer求子集,然后求可以区分输入矩阵的不同行所需的最少列数,即最少使用的LED数目,使用了最简单的暴力法进行的比较(这样很慢),嗯,很黄很暴力。#include #include #include using namespace std;//#define testconst int MAX_N = 100原创 2014-02-22 17:56:03 · 691 阅读 · 0 评论 -
stl算法:next_permutation剖析
在标准库算法中,next_permutation应用在数列操作上比较广泛.这个函数可以计算一组数据的全排列.但是怎么用,原理如何,我做了简单的剖析.首先查看stl中相关信息.函数原型:template boolnext_permutation( BidirectionalIterator _First, BidirectionalIterator _L转载 2014-02-19 10:57:54 · 571 阅读 · 0 评论 -
UVa 729 - The Hamming Distance Problem
题目链接:UVa 729 - The Hamming Distance Problem求下一个排列的水题,不过我还是学习到了一些东西。a是char数组,可以使用memset(a,0,sizeof(a)) 清空a,这道题必须清空。以前经常使用这个函数给整型或者bool型的数组赋初值了,还没用过这个函数对char数组赋初值。还有一个问题我特想知道,这个题怎么优化,怎么那么多大神提交的代码那原创 2014-02-22 23:43:56 · 548 阅读 · 0 评论 -
UVa 639 - Don't Get Rooked
题目链接:UVa 639 - Don't Get Rooked回溯题目,和八皇后有些区别,这道题加上了围墙,而且不限制对角线了,所以说一行就可能有多个棋子。这样的话需要全局回溯,就是说回溯算法里边应该有双重for循环,放置每一个棋子前判断一下当前位置是否合法。开始想当然,很快的写了一个回溯,然后就错了,例子就没有通过。也贴出来,警示一下自己。错误原因:如果遍历到一个围墙,取消了围墙所在行和原创 2014-02-23 22:55:18 · 510 阅读 · 0 评论 -
Bellman-Ford 算法及其优化
转自:http://hi.baidu.com/jzlikewei/blog/item/94db7950f96f995a1038c2cd.htmlBellman-Ford 算法及其优化Bellman-Ford算法与另一个非常著名的Dijkstra算法一样,用于求解单源点最短路径问题。Bellman-ford算法除了可求解边权均非负的问题外,还可以解决存在负权边的问题(转载 2014-02-19 20:09:15 · 835 阅读 · 0 评论 -
UVa 539 - The Settlers of Catan
题目链接:UVa 539 - The Settlers of Catan简单回溯,注意一下题目给的是无向边。#include #include #include //#define testusing namespace std;const int MAX_N = 25 + 5;int vis[MAX_N][MAX_N];int G[MAX_N][MAX_N];int m原创 2014-02-24 10:30:00 · 629 阅读 · 0 评论 -
UVa 301 - Transportation
题目链接:UVa 301 - Transportation回溯,注意这个题是一个方向走的,不回头。写了两份代码,第一份WA,换了种思路,第二份AC了,都贴出来,以后再研究研究。/**WA*/#include #include #include using namespace std;const int MAX_N = 22 + 5;int m,n,c;struct or原创 2014-02-24 18:25:39 · 590 阅读 · 0 评论 -
UVa 140 - Bandwidth
题目链接:UVa 140 - Bandwidth这题目放在书上回溯那块,我就直接往回溯那块想,但是这不知道怎么做到字典序,感觉就是做到了也很麻烦。在网上搜了搜题解,看见好多人都用next_permutation做到的,看起来也没有超时。当然用这个函数做到字典序就比较简单了。开始WA了几次,后来发现是char数组没有开够,开成26了。改了就AC了,0.025s。#include #原创 2014-02-24 22:12:52 · 610 阅读 · 0 评论 -
UVa 10594 - Data Flow(无向图的最小费用最大流问题)
题目链接:UVa 10594 - Data Flow这道题是无向图的最小费用最大流问题,看清楚是无向图的。这么说无向图和有向图的费用流问题有什么区别呢?主要是反向边的问题。首先我们说一下最大流问题中的反向边,我们需要将其cap[u][v]=0表示容量为0,而在费用流问题中添加了费用,所以肯定不能像之前那么简单处理了,那怎么办呢?在有向图中,没有存在的反向边我们用cap[u][v]=0表示容量为原创 2014-02-21 13:50:54 · 8535 阅读 · 5 评论 -
UVa 10887 - Concatenation of Languages
题目链接:UVa 10887 - Concatenation of Languages这题目最后看了GooMaple的代码才AC了,还是有几个疑问。1、为什么用cin读串不行,用gets可以,题目说了字符是从'a'~'z'的,没有空格的话我认为用哪个读都是一样的。2、为什么hash那块需要保证是正数,sum怎么算也应该不是负数。希望有大神可以指点一二。#include #in原创 2014-02-25 22:32:47 · 639 阅读 · 0 评论 -
UVa 10603 - Fill
题目链接:UVa 10603 - Fill隐式图:仅给出初始结点、目标结点以及生成子结点的约束条件(题意隐含给出),要求按扩展规则应用于扩展结点的过程,找出其他结点,使得隐式图的足够大的一部分编程显式,直到包含目标结点为止。这道题就是隐试图搜索,其实就是用BFS。这里要注意一下vis数组,这里开二维数组就可以了,原因就是开始水量已经给出了,那么三个水杯中只要有两个水杯的水量确定了,那么第三原创 2014-02-25 18:49:39 · 602 阅读 · 0 评论 -
UVa 537 - Artificial Intelligence?
题目链接:UVa 537 - Artificial Intelligence?字符串处理,简单题。注意几个函数:1、strncpy,如果没有把源串全部复制完,需要手动补‘\0’。还有这个函数可以通过源串的指针确定从哪开始复制,这点刚开始没有想到。2、atof 字符串转化为浮点数,头文件,stdlib.h。#include #include #include #include原创 2014-02-26 14:24:40 · 724 阅读 · 0 评论 -
UVa 10330 - Power Transmission (最大流+拆点)
拆点:在这道题里边学会了拆点的思想。简单说就是对于一个点i,将其拆成两个虚点 i 以及 i',然后从 i 连边到 i' ,容量为所要求(本题为调节器)的容量。而对于两个真实点i和j,本该是i连到j,现在将i‘连到j。下边是的题解,转自:http://blog.youkuaiyun.com/accelerator_/article/details/17072089#include #include原创 2014-02-20 18:20:31 · 648 阅读 · 0 评论 -
UVa 10110 - Light, more light
题目链接:UVa 10110 - Light, more light一个整数N,如果有两个整数的乘积等于N,那么这两个数可以开关灯抵消,而如果这两个整数相等,也就是说N是可以被开方的,那么肯定抵消不了。所以这道题的关键就在于判断N是不是可以被开方的。刚开始没看清N的范围,用了int,出现了TLE,改成long long 就好了,不知道为什么范围不够会出现这个错误。#include #原创 2014-02-27 19:25:18 · 582 阅读 · 0 评论 -
UVa 424 - Integer Inquiry
题目链接:UVa 424 - Integer Inquiry两个大数相加,高精度最水的题了,用了Rujia Liu 的模版。#include#include#include using namespace std;const int maxn = 200;char line[maxn];struct bign{ int len, s[maxn]; bign()原创 2014-02-27 11:02:34 · 492 阅读 · 0 评论 -
UVa 10494 - If We Were a Child Again
题目链接:UVa 10494 - If We Were a Child Again高精度除法和取余,不太会写除法,从网上找来的代码,可以当做模版用。#include#include#include/**高精度除法和取余*/struct bign{ int len; int s[1000];};bign a,res;char str[1000];long原创 2014-02-27 11:09:07 · 637 阅读 · 0 评论 -
UVa 748 - Exponentiation
题目链接:UVa 748 - Exponentiation求一个小数的幂,说白了就是先记下来小数点的位置,然后使用使用高精度连乘,估计这里可以使用快速幂,不过我嫌麻烦没试。。最后添加上小数点就可以了。、#include #include #include using namespace std;const int maxn = 200;const int maxm = (1 <原创 2014-02-27 11:21:55 · 591 阅读 · 0 评论 -
UVa 465 - Overflow
题目链接:UVa 465 - Overflow高精度,注意去了前0再比较。除了使用高精度,这道题用double也可以做。double范围-1.7*10^(-308) ~ 1.7*10^308。#include#include#include using namespace std;const int maxn = 200;const int maxm = 2147483647;原创 2014-02-27 11:17:11 · 575 阅读 · 0 评论 -
qsort和sort的详解和比较函数的区别
面先对qsort和sort进行详细的解释,然后再将区别!(需要特别注意的就是qsort和sort的比较函数的写法,很容易出错)First qsort基本快速排序的方法,每次把数组分成两分和中间的一个划分值,而对于有多个重复值的数组来说,基本排序的效率较低。集成在C语言库函数里面的的qsort函数,使用三路划分的方法解决这个问题。所谓三路划分,是指把数组划分成小于划分值,等于划分值转载 2014-02-27 14:46:42 · 777 阅读 · 0 评论 -
UVa 575 - Skew Binary
题目链接:UVa 575 - Skew Binary水。。。#include #include #include using namespace std;char s[100];int res;int main(){ while(cin>>s,strcmp(s,"0")) { res = 0; int len = strlen原创 2014-02-27 18:11:04 · 692 阅读 · 0 评论 -
UVa 113 - Power of Cryptography
题目链接:UVa 113 - Power of Cryptography这题挺没意思的,勉强也算是高精度吧,double范围-1.7*10^(-308) ~ 1.7*10^308,这题目的p没超过范围。我在这题中发现了另一个问题,使用cout输出double型数据,如果那个double数据超过一定长度,那么cout输出的是用科学计数法表示的,而printf("%.lf\n",a)不会,所以原创 2014-02-27 17:39:55 · 781 阅读 · 0 评论 -
Floyd算法
正如我们所知道的,Floyd算法用于求最短路径。Floyd算法可以说是Warshall算法的扩展,三个for循环就可以解决问题,所以它的时间复杂度为O(n^3)。Floyd算法的基本思想如下:从任意节点A到任意节点B的最短路径不外乎2种可能,1是直接从A到B,2是从A经过若干个节点X到B。所以,我们假设Dis(AB)为节点A到节点B的最短路径的距离,对于每一个节点X,我们检查Dis(AX)转载 2014-02-19 11:16:40 · 631 阅读 · 0 评论 -
筛法求素数
//筛法求素数void judge(){ //首先将下标为偶数的设为false奇数下标设为true a[0] = false; a[1] = false; int i; for(i = 2;i <max_N;i++) { if(i % 2 == 0) a[i] =false; else原创 2014-02-19 10:59:00 · 591 阅读 · 0 评论 -
UVa 10465 - Homer Simpson
题目链接:UVa 10465 - Homer Simpson尽量用完时间t,求出最多吃多少个汉堡;如果实在用不完时间,再输出喝啤酒的时间。贪心,或者完全背包。/**贪心*/#include using namespace std;int main(){ int n,m,t; int min_N,num; while(cin>>n>>m>>t)原创 2014-02-28 17:23:17 · 615 阅读 · 0 评论 -
UVa 10250 - The Other Two Trees
题目链接:UVa 10250 - The Other Two Trees没做出来,看了别人的题解。首先将四棵树连起来,你得看出来这个四边形是个正方形,然后题目就简化成了给出一个正方形和它的两个顶点左边,让求另外两个顶点坐标。看看下边这个图就懂了。#include #include #include #include using namespace std原创 2014-02-28 08:49:09 · 624 阅读 · 0 评论 -
UVa 1422 - Processor
题目链接:UVa 1422 - Processor优先队列 + 二分 + 贪心两次应用贪心,第一次是对开始时间排序,然后枚举时间,任务开始时间小于当前枚举时间入优先队列,优先队列是按照结束时间越早优先级越高再次排序,这也是第二次贪心。当队列中的第一个元素的结束时间小于当前枚举时间的起始值时,返回0,表示这个速度不够大,需要继续二分增加速度,返回1,表示速度过大,继续二分减小速度。#in原创 2014-02-28 09:58:10 · 1075 阅读 · 0 评论 -
中缀表达式转后缀表达式
中缀表达式转后缀表达式中缀表达式a + b*c + (d * e + f) *g,其转换成后缀表达式则为a b c * + d e * f + g * +。转换过程需要用到栈,具体过程如下:1)如果遇到操作数,我们就直接将其输出。2)如果遇到操作符,则我们将其放入到栈中,遇到左括号时我们也将其放入栈中。3)如果遇到一个右括号,则将栈元素弹出,将弹出的操作符输出直到遇到左括号为原创 2014-02-19 10:57:37 · 492 阅读 · 0 评论 -
扩展欧几里得算法
数论题:线性方程看了《数论概论》的相关章节-《线性方程与最大公因数》首先是要证明一个方程必定有整数解ax+by=gcd(a,b); 为方便 g=gcd(a,b),ax+by=g这个证明有些复杂就不写了,而如何构造一个可行解(x1,y1)其实也在证明过程中在得到一个可行解后就可以得到无数组解,他们是(x1-k*(b/g) , y1+k*(a/g)) ,(其中g=gcd(a,原创 2014-02-19 10:58:56 · 599 阅读 · 0 评论 -
二叉树先序、中序、后序三种遍历的…
本贴给出二叉树先序、中序、后序三种遍历的非递归算法,此三个算法可视为标准算法。1.先序遍历非递归算法#define maxsize 100typedef struct{ BitreeElem[maxsize]; int top;}SqStack;void PreOrderUnrec(Bitree t){ SqStac原创 2013-08-08 13:25:14 · 685 阅读 · 0 评论 -
[转]二叉树的建立和遍历
#include "stdio.h"#include "stdlib.h"#define Maxsize 100;typedef int ElemType;typedef struct BT{ElemType data;struct BT *lch, *rch;} BT;BT *CreatBT ();void preorder (BT * T);void inorder原创 2013-08-08 13:25:12 · 515 阅读 · 0 评论 -
链式线性表
#include #includeusing namespace std;int count=0;struct node{ int data; node * next; };node *Creat(){ node *p1,*p2,*head; int a; head=0; cout cin>>a; while(a!=-1) { p1=new node;原创 2013-08-08 13:24:59 · 797 阅读 · 0 评论 -
顺序线性表
#ifndef SQLIST_H#define SQLIST_H#include #include #define MAXSIZE 100 //顺序表的最大存储容量#define INFINITY 65535 //设置为βtypedef int ElemType; //顺序表的数据类型,自定义typedef struct { ElemType data[MAXSIZE];//原创 2013-08-08 13:24:55 · 578 阅读 · 0 评论