2011年9月16日
摘要: zzhttp://blog.sina.com.cn/s/blog_6ad20aef0100mc1a.htmlSpfa算法 (模板源代码) 这是Bellman Ford的改进算法。 算法介绍:建立一个队列,初始时队列里只有起始点,在建立一个表格记录起始点到所有点的最短路径(该表格的初始值要赋为极大值,该点到他本身的路径赋为0)。然后执行松弛操作,用队列里有的点去刷新起始点到所有点的最短路,如果刷新成功且被刷新点不在队列中则把该点加入到队列最后。重复执行直到队列为空。 时间复杂度:期望的时间复杂度O(ke), 其中k为所有顶点进队的平均次数,可以证明k一般小于等于2。 通用模板设计(源代码... 阅读全文
posted @ 2011-09-16 15:59 不是我干的 阅读(3174) 评论(0) 推荐(0)
  2011年9月14日
摘要: 题意:双核电脑处理任务。每个任务在每个核中处理的cost已知,并且已知如果某两个任务在不同核时的extra cost。思路:最大流最小割。难点在于构图。构图时,把核A作为源点,把核B作为汇点。任务作为中间节点。cost作为单向边。特别地,对于“如果某两个任务在不同核时的extra cost。”作为两个任务的双向边。这样构成的图用dinic求最大流。结果则是答案。不得不感慨最大流真是好用。#include<iostream> #include<string> using namespace std; const int N=20015,M=200015; const in 阅读全文
posted @ 2011-09-14 19:31 不是我干的 阅读(268) 评论(0) 推荐(0)
摘要: zzhttp://blog.sina.com.cn/s/blog_61533c9b0100iawn.htmlDinic算法是基于分层思想的网络流算法,它的的效率一般比E-K算法高算法的思想:Dinic是在分阶段地在层次图中增广。它与最短路径增值算法不同之处是:在Dinic算法中,我们用一个dfs过程代替多次bfs来寻找阻塞流。下面给出其算法步骤:1、初始化流量,计算出剩余图 2、根据剩余图计算层次图。若汇点不在层次图内,则算法结束 3、在层次图内用一次dfs过程增广 4、转步骤2算法模板://时间复杂度O(V^2E) #include<iostream>#define Max 21 阅读全文
posted @ 2011-09-14 17:35 不是我干的 阅读(982) 评论(0) 推荐(0)
  2011年9月7日
摘要: 算是最大流基础题了吧。构图:多出一个源点start,一个汇点final源点到5个衣服的边权值是每个衣服的数量数。然后每个衣服到匹配的人的边权值都是1,然后每个人到汇点的边权值都是1.这样最大流一下,其实就是用最大流求最大匹配。#include<iostream> #include<queue> using namespace std; const int N=200; const int M=2000; char range[N][2]; bool visit[N]; int pre[N]; int k=1; int start; int final; int n; c 阅读全文
posted @ 2011-09-07 19:33 不是我干的 阅读(148) 评论(0) 推荐(0)
  2011年9月6日
摘要: 不错的构图题。思路:和一般的最大流图论题一样,难点在构图上。刚开始有点想用二分,但其实不用什么二分匹配,有二分的思想即可,把cow二分成两批。即一个点拆成相连的两个点。然后左边是food的点,右边是drink的点。具体看图一目了然。#include<iostream>#include<queue>#include<algorithm>using namespace std;const int N=405;const int M=100000;int n,f,d;int edgehead[N];int k=1;bool visit[N];int pre[N]; 阅读全文
posted @ 2011-09-06 22:05 不是我干的 阅读(135) 评论(0) 推荐(0)
摘要: 是道不错的题目。最瘦生成树的定义:最长边和最短边之差最小的一棵生成树。思路是kruskal+枚举算法。这题让我明白枚举的角度选择问题真是有学问。刚开始一直没想明白要怎么枚举。后来参考了别人,枚举直接枚举最小生成树的最小边即可。求最小生成树时,我们用sort把边都排序了一边。注意:最小生成树求解过程是一种贪心算法。每次都选最短的边!故sort后我们从小到大枚举最小边。这样,当最小边确定后,用kruskal算法,它自动会生成一棵最小树,这棵最小树肯定是最小边已确定的最大边为最小的树。故枚举最小边这个算法是正确的。总而言之。要好好理解kruskal的贪心思想。#include<iostream 阅读全文
posted @ 2011-09-06 16:35 不是我干的 阅读(196) 评论(0) 推荐(0)
  2011年8月31日
摘要: #include<iostream> using namespace std; int n,m; const int N=22; char mat[N][N]; int sx,sy; int dx[4]={-1,0,0,1}; int dy[4]={0,1,-1,0}; int ans; bool visit[N][N]; void dfs(int x,int y) { for(int i=0;i<4;i++) { int xx=x+dx[i]; int yy=y+dy[i]; if(xx>=1&&xx<=m&&yy<=n&a 阅读全文
posted @ 2011-08-31 22:56 不是我干的 阅读(119) 评论(0) 推荐(0)
摘要: 其实这题还是不难。精彩的地方在于用位处理来记录公司。这样再用floyd传递闭包时候只需要位运算。很妙。#include<iostream>#include<string>using namespace std;int n;const int N=205;int mat[N][N];void floyd(){for(int k=1;k<=n;k++)for(int i=1;i<=n;i++)for(int j=1;j<=n;j++)if(mat[i][k]&mat[k][j]){mat[i][j]|=(mat[i][k]&mat[k][j 阅读全文
posted @ 2011-08-31 19:53 不是我干的 阅读(160) 评论(0) 推荐(0)
  2011年8月30日
摘要: 转自http://kb.cnblogs.com/page/104895/10年软件开发教会我最重要的10件事来源:jobbole发布时间: 2011-06-10 20:56阅读: 2016 次全屏阅读 [收藏] 0. “面向对象”比你想象的要难得多 也许只有我有这种想法,不过我曾经以为计算机科学课上学过的“面向对象”是很简单的东西。我的意思是,创建一些类来模拟现实世界能有多难啊?其实,那还真是挺难的。 十年之后,我仍然在学习如何合理地建模。我后悔以前我没有花更多的时间来学习面向对象和设计模式。优秀的建模技术对于每一个开发团队都是非常有价值的。 1. 软件开发的难点在于沟通 这里的沟通... 阅读全文
posted @ 2011-08-30 20:29 不是我干的 阅读(173) 评论(0) 推荐(0)
  2011年8月29日
摘要: 思路:1.本题数据是单向边,说明是有向图,但是其实分析题目,要求是互相认识,则单向边需要处理成无边,即有向图处理成无向图。2.求补集。然后求极大联通分量,在同一个连通分量里的两个人都是互相不认识。在不同连通分量里的两个人互相认识。3.用dfs求联通分量,同时01染色,相邻的点颜色不同。因为在同一个连通分量里的人都互相不认识,即我们应该将这个联通分量里的人染色成二分图(x,y),以便于分配到不同的队伍里。(染色成二分图是为了使之满足题意的两个队伍之间人数最close)。4.判定no solution情况二分图xy里,x或者y组里的任意两个人如果在补集里面有边,则输出"No soluti 阅读全文
posted @ 2011-08-29 20:05 不是我干的 阅读(219) 评论(0) 推荐(0)