ACM
文章平均质量分 62
heb1c
心有猛虎,细嗅蔷薇。
展开
-
简单DFS — POJ1979
题意很简单 :给你一个row*col的矩阵,上面的'#'代表你不能走的地方,'.'表示你能走的地方,'@'表示你的起点,问你最多能走多少格。 这也是一道非常基础的DFS题,我们来看一下代码实现: #include #include #define MAXN 20 + 10 char graph[MAXN][MAXN]; int m, n; int result; void DFS(in原创 2016-11-20 11:17:34 · 432 阅读 · 0 评论 -
快速幂取余—HDU1061
题目意思炒鸡简单:给你一个N,计算N^N个位上的数字是多少 做法也很简单,但是普通做法会超时,所以要用到快速幂取余。 啦啦啦,召唤代码~~:#include int FPT(int a,int n,int mod) { if(n==0) return 1; int ans=qpow(a,n/2,mod); ans=ans*ans%mod;原创 2016-11-20 12:33:55 · 583 阅读 · 0 评论 -
二分图的最大匹配--匈牙利匹配算法
例子就以sicnuoj的题,http://acm-sicnu.com/problem/32/ #include #include #include using namespace std; int match[200][400] = {0}; int lib[400] = {0}, used[400] = {0}; int n, m, no, sum = 0; int find(in原创 2016-11-04 17:58:04 · 350 阅读 · 0 评论 -
最短路—SPFA&dijkstra(51nod1459)
题目: 你来到一个迷宫前。该迷宫由若干个房间组成,每个房间都有一个得分,第一次进入这个房间,你就可以得到这个分数。还有若干双向道路连结这些房间,你沿着这些道路从一个房间走到另外一个房间需要一些时间。游戏规定了你的起点和终点房间,你首要目标是从起点尽快到达终点,在满足首要目标的前提下,使得你的得分总和尽可能大。现在问题来了,给定房间、道路、分数、起点和终点等全部信息,你能计算在尽快离开迷宫的前提下原创 2016-11-20 13:01:31 · 387 阅读 · 0 评论 -
BFS—HDU1548
题目意思呢大致是: 电梯每层有一个不同的数字,例如第n层有个数字k,那么这一层只能上k层或下k层,但是不能低于一层或高于n层,给定起点与终点,要求出最少要按几次键。 最开始想的,诶这不就是一道深搜的题么,结果写好后发现炸掉了,想了想果断广搜: #include #include #include #include using namespace std; int n,s,e原创 2016-11-20 12:45:47 · 320 阅读 · 0 评论 -
拓扑排序算法—HDU1285
运用拓扑排序的算法 这也是老师提供的模板 把每个关系构成图 离散没有学好... 但是有模板啊,不过数学真的要好好学,嗯! 代码: #include #include using namespace std; #define MAXN 520 int toposort(int n,int mat[][MAXN],int* ret) { int d[MAXN],i,j,k;原创 2016-11-20 12:22:11 · 308 阅读 · 0 评论 -
并查集—HDU1232
一看到题目,很明显的并查集嘛,走起走起。 #include int bin[1002]; int findx(int x)//用来找每个节点的根节点 { int r=x; while(bin[r] !=r) r=bin[r]; return r; } void merge(int x,int y) { int fx,fy; fx = fi原创 2016-11-20 12:17:27 · 371 阅读 · 0 评论 -
KMP—HDU2203
这道题吧,刚开始觉得不知道从哪里下手,后来上了个厕所,突然想到,其实把匹配串复制一遍,然后用KMP搜一遍就行了: #include #include #include #define val 100005 int lens,lenp,next[val]; char s[val*2],p[val]; bool kmp(); int main() { wh原创 2016-11-20 12:14:27 · 319 阅读 · 0 评论 -
DFS—HDU1010
大意为给定一个N*M的迷宫以及起点和终点,迷宫中有一些障碍无法穿过,问能否不重复也不停留地在刚好一共走T步出迷宫。 这道题呢DFS也是能过的,但是如果用上奇偶剪枝的技巧速度会快很多: #include #include using namespace std; char map[10][10]; int flag, Xnum, Sx, Sy, Dx, Dy; int n, m, t; in原创 2016-11-20 11:27:50 · 383 阅读 · 0 评论 -
扩展欧几里得—POJ1061
题目就是说,给你两个起始的x和y,然后x每次增加m,y每次增加n,以及长度L,求出最小的变化次数T,有(x+m*T)-(y+n*T)==P*L. 我们先得出方程 (m-n)t+Lk=y-x, t为步数 k为圈数, 然后根据扩展欧几里得就能得出解。 要注意呀一点就是,对L取余要防止负数情况。 代码如下: #include #include using namespac原创 2016-11-20 15:32:58 · 326 阅读 · 0 评论