摘要:
毕竟是写的第一个网络流,感觉还是要好好总结一下,看了算法导论那本书之后,感觉上还是似懂非懂,直到写到这道题,看了一下别人的代码,其实就是找出能够到达那个汇点的每一个路径,然后在一路上的流量减去,相当于已经将这么多的流量运送到了汇点,然后不断找路径直到找不到能够到达的路径。。。View Code 1 #include<iostream> 2 #include<stdio.h> 3 #include<queue> 4 #define S 205 5 using namespace std; 6 int n,m,map[S][S],link[S],answer; 阅读全文
摘要:
说实话,真心觉得这个实在是一个模拟的题目一般,但是知识点却是图论当中的独立集。。。掌握知识点不牢固啊。。题意就是一个配色方案,对于一条边而言,两端的顶点颜色不能够相同,尽可能的将颜色染为黑色。。求配色方案当中的黑色最多为多少,输出一个最佳配色方案中的黑色节点。。View Code 1 #include<iostream> 2 #include<stdio.h> 3 using namespace std; 4 struct node 5 { 6 int end,next; 7 }edge[10002]; 8 int head[102],n... 阅读全文
摘要:
小弟初学最小生成树算法,起初还是自己的几个队友教会了我思想,最小生成树说白了就是在一个图当中寻找出n-1条边使得n个结点都是连通的,但是边权值总和最小。Prim算法是通过不断寻找结点,找出当前所生成的树周围的边权值最小的一个边把这条边给纳入进来,然后通过纳入进来所引入的新的结点来更新现在整个树到达其他未进入到生成树中来的距离,使得每次总能纳入最小的边权值而引入新结点。具体代码如下:View Code 1 #include<iostream> 2 #include<stdio.h> 3 #include<string.h> 4 #define MaxSize 阅读全文
摘要:
之前已经有一个prim的解题报告了,现在就直接说krukal其中的实现,里面就是将图中所有的边都包含进来,记录所有的边权值,然后根据边权值进行排序,然后每次都是寻找最小的那条边纳入进来,若纳入进来的这条边当中的两个节点都已经存在现在已经生成的树当中的话,那么接着寻找下一条边。若寻找的两个点其中有点不是生成树当中的,那么比较这两个点的父亲节点所包含的儿子的总数,总数大的则为生成树的本体,那么将其中总数小的父亲节点的父亲赋值为另一方,然后继续寻边,最后直到寻找到n-1条边即可。代码具体如下:View Code 1 #include<iostream> 2 #include<std 阅读全文
摘要:
今天有点小偷懒了。。。早上的时候就只敲了两个最短路径的题目,之所以说偷懒。。是因为之前就敲过了。。好了不说废话队友闲我啰嗦,先用了一个floyd这个比较浪费时间的。。不过之后写的djs就还行了。。。不说了直接看代码View Code 1 #include<iostream> 2 #define min(a,b) a<b?a:b 3 #define INF 100000000 4 using namespace std; 5 int map[220][220]; 6 int main() 7 { 8 int m,n,s,e,w; 9 while... 阅读全文
摘要:
题意:在一个信息网络当中,为了能够告知学校最新信息,现在告诉你各个学校之间的联系关系,问你最少能够通知多少个学校就能完成对所有的学校通知完毕,因为具有内在联系的学校会相互通知,若我们现在想要通知其中一个学校就能通过它们内部传递然后就能使所有学校都知道,那么此时我们使某些学校存在一个联系就可以了,问这样的联系我们最少需要创建多少。解题思路:只要算出强连通的个数,并且知道哪些强连通没有入度,计数,然后第二个答案只要计数所有强连通入度为0,出度为0的个数,然后取两者最大值,这就是要添加的最少边数。。View Code 1 #include<iostream> 2 #include< 阅读全文
摘要:
有点想要敲自己一顿了,这道题属于图论当中的比较简单的最短路径,实在是有点汗颜,本来觉得自己思路也是基本上理解了的,看了自己那本图论的算法设计的教材之后,感觉还是蛮好的。但是现在一做题目竟然wa了这么多边。。。呜呜呜~~~不过幸好是最后这一刻还是来了。。。因为对于这个题目当中的图而言是乘法所以就相当于说是给图加上了负权值的边,所以我们只要用Floyd算法有兴趣的话可以去看一下这位大哥写的东西。http://www.cnblogs.com/twjcnblog/archive/2011/09/07/2170306.html具体代码如下:View Code 1 #include<iostream 阅读全文
摘要:
先说一下题目的意思把。。就是现在要求你去除掉图中的一个割点,判断去除哪一个割点能使得整个图分成的强联通分量最多,然后把这个强联通分量的数量输出就ok啦。。。思路:从图中的强联通分量当中的点出发,然后如果该点作为根节点出发搜索的话,那么当他的强联通分量的孩子数量超过1的时候计数,然后当它不是根的时候,如果他的子节点访问时间戳比他大那么这个时候对于该割点也计数。View Code 1 #include<iostream> 2 #include<stdio.h> 3 #define min(a,b) a<b?a:b 4 #define N 10005 5 using n 阅读全文
摘要:
判断强连通图之后,果断要做做强连通分量的题目,之前做求割点的题目的时候就已经学过了tarjan算法了。。但是还是不会用,一开始看到这个题目的时候不知道怎么办,感觉就是有种怪怪的感觉。。看了网上的代码,出度和入度的判断真的还蛮精妙的。。通过一边tarjan算法已经将一个图分解成了很多个前连通图了。。。这要计算出每一个前连通分量的入度和出度来,然后添加的边只要能使所有强连通分量连通就可以。。所以只用添加max(入度缺少,出度缺少)。。View Code 1 #include<iostream> 2 #define min(a,b) a<b?a:b 3 #define max(a, 阅读全文
摘要:
一开始看教材的时候,不明白low是什么意思,不过现在稍微能够理解的就是,low可以看成是该点能够回到祖先被访问的时间点,而dfn则是深度,换句话说,就是访问的时间,所以只要把他理解为时间就好。对于一个点而言,如果他的子孙的祖先的访问时间要小于他本身,那么也就是说他的子孙回到了他本身之上,那么这个时候该点就不能成为割点了,如果子孙的祖先的访问时间均大于他本身,那么也就是说他的子孙除了他之外没有更高位的祖先,那么该点肯定为割点。。如果好好理解了上面这段话的意思,那看代码的话,就很容易看懂了。。。View Code 1 #include<iostream> 2 #include<s 阅读全文
摘要:
昨天开始了强连通,原本以为这一道题目是求强连通分量的个数的。。。但是题意就是求这是否是一个强连通图。。所以题意不解释了。。做题方法大概就是,先深搜一边,入栈,从栈顶去元素深搜如果能够搜到所有的点,那么就说明这是一个强连通图。举个例子,如果图能从节点1出发寻找到所有的点,然后现在将有向边方向,如果还能搜到所有的点的话,就是一个强连通图,因为能够通过1搜索所有点,然后反边就说明能够从任一点到达1点。。理解了上面这段话就好说了。。View Code 1 #include<iostream> 2 using namespace std; 3 #define Size 100010 4 .. 阅读全文
摘要:
题意很明显,就是说现在有n个孩子正在玩游戏,完成一个传递的游戏,举个例子,A传递到B小朋友,然后B小朋友传递给C小朋友,那么此时,C小朋友将拥有2的传递值,C是胜利者,若C又传递回A,那么A,B,C三者都拥有传递值为2的胜利者,说白了就是强连通的一个练习。思路就是分清楚这整个图当中的强连通分量,每个分量包含了哪些点,将这些分量缩成一个点,然后建立这些点的一个反向图,然后每次从入度为0的强连通分量深搜,最后标记哪些强连通分量为max。那么只要该点所属的强连通分量为max,那么该点,也就是该小朋友就是赢家。。View Code 1 #include<iostream> 2 #defi. 阅读全文
摘要:
最近学了一些dp的皮毛之后,现在开始图论知识的学习,说实话,初步不知道怎么弄这个,然后无意间在网上下了一本关于图论的算法设计程序的教程,然后感觉还不错,结果后面才发现原来多年前,我的师兄就给了我这样一本好的资料。感觉有点小悲催啊。。~有点对不起师兄的感觉,然后今天终于写了一个小知识点,欧拉回路的一题,其实这个也包含了通路的知识。还是说一下题意吧。。现在你是一个豪宅的管家,因为你有个粗心的主人,所以需要你来帮忙管理,输入会告诉你现在一共有多少个房间,然后会告诉你从哪个房间出发,你的任务就是从出发的房间通过各个房间之间的通道,来把所有的门都关上,然后最后回到0的房间。一开始写的时候,我想因为我自己 阅读全文
摘要:
起先,队友和我说过并查集,但是看到这道题目的时候我想还是暂时不用,先凭自己的想法做一下的好,所以就自己闷着脑袋开始做了,然后就开始自己的深搜的,反正这个城市给我的的道路我们建好了一个图之后,只要发现这个图里面的一条边的话我们就计算一次,然后累加,最后组成一个连通图的最小边数就是n-1,所以只要拿n-1-累加的边数就可以了啊。。代码具体如下:View Code 1 #include<iostream> 2 using namespace std; 3 int f[1002][1002],Count,visit[1002]; 4 int n,m; 5 void dfs(int... 阅读全文
摘要:
起初也不知道这个题目还有一个更为简单易想的办法,那就是记忆化的搜索。因为题目的基本意思就是要你匹配给你字符串的所有长度的前缀在字符串当中所出现的次数,那么这个时候我们可以设计一个简便的记忆方法。设置一个place来记录每次新的前缀长度所匹配的位置信息。例如ababab这个字符串我们可以首先让这个place数据先匹配“a”字符串,那么匹配a的位置信息就是Place={1,3,5}一共三次然后匹配"ab"字符串,只用在以前place的基础上匹配后面跟的'b'就行,因为只有出现过'a'的位置才可能匹配"ab"字符串,所以第二次匹 阅读全文
摘要:
长话短说,题目的意思很明确,就是让给你一个字符串,然后计算不断增加的前缀字符串在整个字符创当中出现的次数,可能出现的次数过大,所以要求结果%10007.Kmp算法,相信正在做此题的人应该都会对这个有所了解,对于整个字符串做一个预处理,生成一个next的数组,其中的内部数据next[i]=j就表示在前i个字符串当中,从前1到j的j长度字符字串和i-j+1到i的j长度的字符字串相等。那么举一个例子就可以知道:ababab001234那么接下来就是关于dp的状态方程的理解了dp[i]=dp[next[i]]+1;具体意思就是说利用next数据跳转到第next[i]的位置,这个位置的跟之前的有过多少次 阅读全文
摘要:
说白了,题目就是给我们n个点,要求我们对这n个点围成的多边形求其重心,说实话一开始都没有接触过计算几何的东西,有些东西不理解啊..~~当质量其中的顶点上的时候,设其顶点的质量为m则对于n各点而言,n个点的重心为:Focusx=∑(xi*mi)/∑mi;Focusy=∑(yi*mi)/∑mi;i从0到n当这其中的n个点的质量平均的时候,那么Focusx=∑xi/n;Focusy=∑yi/n;对于三角形而言,给你三个坐标点,重心的坐标就是三个坐标点之和除3。那么这个题目如果按照对n个点求和除n的话,精度太低,所以会wa,这是我最初的想法,悲催~~正确的思路应该是将这n个点分解成n-2个三角形求其重 阅读全文
摘要:
悲催了..~~这道01背包的题目我wa了好多遍,感受还是颇多的...说是01背包,但是还是有一定的研制条件的。。。首先当饭卡当中的钱不足5块的时候是不能消费的,所以就应该是原来的值。这里就wa了很多遍啊s。然后变通一下,要使得饭卡当中所剩余额最小,那么也就是说最大价格的那道菜要在最后买,这样才能得到最优解,那么对于其他n-1道菜就是一个简单的0-1背包了,只是这儿有一个变通,那就是背包所能得到的价值和它所耗空间是一样的...接下来就看代码好好体会了。。。View Code 1 #include<iostream> 2 #include<stdio.h> 3 using 阅读全文
摘要:
题意简单明确,打怪升级,现在需要n的经验就可以升最后一集,但是现在玩家有一定的忍耐限度m,因为打怪升级是在无聊,现在有k种怪兽,每种怪兽打败之后都能获得一定的经验值,现在告诉你打败该怪兽玩家能获得经验value1,以及打完该怪兽之后忍耐限度降低value2,现在要求你编写程序算出玩家能够升级并能保存的忍耐限度最大的值,输出最大值。其实就是一个二维费用的背包问题,研读背包九讲当中的第五讲就能知道,只不过是多开一个状态,那么就是Dp[i][j][k]在前i个物品下,花费j、k的代价最大能取到的价值,那么这个题目当中所表达的就是在前i个怪兽下,花费j的忍耐度打到k个怪兽所能获得的最高经验值。View 阅读全文
摘要:
可能是自己的英语不好,一开始不能理解题目的意思,所以还是先讲一下题目的意思,现在acboy有m天的时间来修n门课程,然后给你一个矩阵,A[i][j]表示话J天的时间学习i门课程能够得到A[i][j],那么我们的任务就是把acboy所拥有的天数m天分成一些部分来学习这其中的课程,使得能够在学校课程当中收获最多。看过背包九讲的话,做这个就容易多了,其实就是简单的分组背包问题。View Code 1 #include<iostream> 2 #include<stdio.h> 3 using namespace std; 4 int dp[110],value[110][11 阅读全文