摘要:
毕竟是写的第一个网络流,感觉还是要好好总结一下,看了算法导论那本书之后,感觉上还是似懂非懂,直到写到这道题,看了一下别人的代码,其实就是找出能够到达那个汇点的每一个路径,然后在一路上的流量减去,相当于已经将这么多的流量运送到了汇点,然后不断找路径直到找不到能够到达的路径。。。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 阅读全文