随笔分类 -  图论

1 2 下一页

HDU 1814 模板题 2-sat
摘要:敲模板做的,不知道怎么就对了,注意一下建边即可···贴代码: 1 #include 2 #include 3 using namespace std; 4 #define N 16005 5 struct twosat 6 { 7 int n; 8 vector g[N*2]; 9 bool vis[N*2];10 int path[N*2];11 int c;12 13 bool dfs(int x)14 {15 if(vis[x^1]) return false;16 if(vis[x]) return... 阅读全文

posted @ 2013-08-16 19:08 allh123 阅读(238) 评论(0) 推荐(0)

HDU 4619 Warm up 2 贪心或者二分图匹配
摘要:给同一张横着的牌的所在的格子编同一样的号,这些格子对应x集合,给同一张竖着的牌所在的格子编同一样的号,对应y集合,同一个格子上既有横着的牌又有竖着的牌,那么就建一条边,有冲突就要拿走一张,结果是总的牌数-最大二分图匹配数···贴代码: 1 #include 2 #include 3 #define N 1100 4 int nx,ny; 5 int cx[N],cy[N]; 6 int g[N][N]; 7 bool vis[N]; 8 int map[N][N]; 9 bool path(int u)10 {11 for(int v=0; v<ny; ++ 阅读全文

posted @ 2013-08-15 20:48 allh123 阅读(179) 评论(0) 推荐(0)

最优比率生成树 POJ 2728 迭代或者二分
摘要:别人解题报告的链接:http://blog.sina.com.cn/s/blog_691190870101626q.html说明一下关于精度的问题,当结果是精确到小数点后3为,你自然要把误差定为至少10^(-4),我定的是10^(-8)````这里多定点没事的···然后对于POJ上的提交,如果是用C++提交,可以写printf("%.3lf\n",ans);但是如果是用的G++提交,就得用printf("%.3f\n",ans);当然ans定义的是double型的·····补 阅读全文

posted @ 2013-08-10 21:40 allh123 阅读(275) 评论(0) 推荐(0)

度限制最小生成树 POJ 1639 贪心+DFS+prim
摘要:很好的解题报告:http://blog.csdn.net/new_c_yuer/article/details/6365689注意两点:1.预处理环中权值最大的边····2.可以把去掉度限制后的点看成是连通的,权值为无穷远的点也看做是连通的,反正后面肯定会替换出来的····我的代码没有预处理出权值最大的边,但是第2点事做到了的,这样便于代码的实现·····贴代码: 1 #include 2 #include 3 #include 4 #include 5 #incl 阅读全文

posted @ 2013-08-10 16:38 allh123 阅读(195) 评论(0) 推荐(0)

POJ 1087 ZOJ 1157 插头和插座 网络流 繁琐 不喜欢
摘要:这个题的做法我已经知道,就是先构造出图,用网络流算法走个最大流,由于只有插头插座两种,也可以用二分图(二部图)匹配,但是要我写代码,感觉很烦躁,拖了很久,终于用网络流A了它。记录第一次用map,呵呵。因为老是要做查找操作,所以试试map,希望能省点时间。构图方式如下:加入超源点s和超收点ts点到所有插座的容量为1(因为该插座只有一个)设备要用的插头到t点的容量为该类型插头的个数(例如有3个设备是B插头,插头B到t的容量为3)插头能直接插在插座上(名字相同),那么插座到插头的容量为无穷。插头能通过交换器连接到插座上,该插座到插头的容量也为无穷,用最大流算法求出能输送多少到超收点。再用设备数-该值 阅读全文

posted @ 2013-04-27 20:09 allh123 阅读(228) 评论(0) 推荐(0)

Codeforce 295B Greg and Graph 活用Floyd 任意两点的最短路径
摘要:http://codeforces.com/problemset/problem/295/B该题就是活学活用Floyd,Floyd的本质是每次在原图中加入一个点,看是不是能用该点中间点使得一个点到另一个点的距离更小。比如现在有三个点,1,2,31直接到3的距离是10,1到2的距离是2,2到3的距离是2,那么本来初始状态时1到3的距离为1直接到3,距离为10,在加入了点2后容易发现,1先到2,2再到3,距离一共只有4,小于直接到达,所以1到3的最短距离修改为4依次考察每个点能否成为中间点从而缩短路径,在加入一个点后,更新所有点对的最短距离。所以当顶点个数为n时,复杂度为O(n^3).这个依次删除 阅读全文

posted @ 2013-04-16 16:40 allh123 阅读(280) 评论(0) 推荐(0)

Zoj 1119 POJ 1523 SPF 求关节点及删除关节点会出现多少个连通分量 Tarjan算法
摘要:有最朴素的想法就是依次删除每个点,看剩下的图有多少个连通分量,如果只有一个,不是关节点(也叫割点),否则是关节点。这种算法的复杂度是O(n^3).这里的Tarjan算法的复杂度只有O(n^2),在连通图中只做一次DFS,根据DFS时遍历结点的先后顺序,依次给每个结点编号,这个编号叫该点的深度值,存在数组dfn[]中求每个点的low[]值,low值是这样求的,每个点的low值最初就是该点的深度值。然后看该点的邻接点,如果该点的邻接点被访问过了,low值就是min(low[自己],dfn[邻接点])。如果未被访问过,父结点的 low值=min(low[自己],low[子结点]),如果出现子结点的l 阅读全文

posted @ 2013-04-10 19:17 allh123 阅读(223) 评论(0) 推荐(0)

POJ 1469 ZOJ 1140 Courses 二分图匹配
摘要:继续匈牙利二分匹配,其实我都不知道怎样写匈牙利算法,只是记住了可以这样写,悲哀啊唉````裸的二分匹配,贴代码:View Code 1 #include <cstdio> 2 #include <cstring> 3 #define MAXC 105 4 #define MAXS 305 5 bool g[MAXC][MAXS]; 6 bool used[MAXS]; 7 int p,n; 8 int xx[MAXC],yy[MAXS]; 9 void init()10 {11 int i,j;12 scanf("%d%d",&p,& 阅读全文

posted @ 2013-04-09 22:39 allh123 阅读(228) 评论(0) 推荐(0)

Zoj 1364 Poj 1325 Machine Schedule 二分图匹配 匈牙利算法 求点覆盖数等价于求匹配数
摘要:这题就是A机器有n 种模式,B机器有m种模式一共有k件任务,每件任务既可在A机器的某个模式下完成,也可以在B机器的某个模式下完成。由于机器转换模式要重启,求重启的最少次数,两机器最初的模式是0所以如果某任务可以在A机器或者B 机器的0模式下进行,这件任务就可以不考虑。把A,B机器的每个模式看成顶点。如果某任务可以在A机器的模式i 和B机器的模式j下完成,那么i和j 建一条边,该题可转换为找最小的顶点数,覆盖掉所有出现的边(相当于完成了所有的工作)。而有定理,点覆盖数 = 匹配数,所以,把按如上方式构造出的图求一个最大匹配,其匹配数就是所求,记住去掉所有可以用0模式完成的工作(这些工作不用建边) 阅读全文

posted @ 2013-04-09 21:20 allh123 阅读(135) 评论(0) 推荐(0)

ZOJ 1654 匈牙利算法 二分图匹配 Place the Robots
摘要:给每行上的空地编不同号,就算在同一行上,但是被墙壁隔开了的话也编不同的号,一个编号对应一个顶点,这样的顶点放在集合XI中。给每列上的空地编不同号,就算在同一行上,但是被墙壁隔开了的话也编不同的号,一个编号对应一个顶点,这样的顶点放在集合YI中。如果XI中的某个顶点i和YI中的某个顶点j是在同一个空地上,那么i和j有一条边相连。通过如上方法构造出一个二部图(也叫二分图),然后用匈牙利算法做最大二部图匹配,就OK了,我是通过DFS寻找增广路。贴代码:View Code 1 #include <cstdio> 2 #include <cstring> 3 #define MA 阅读全文

posted @ 2013-04-09 20:17 allh123 阅读(154) 评论(0) 推荐(0)

POJ 1459 ZOJ 1734 Power Network dinic 算法 网络流
摘要:裸的网络流,就是在读数据的时候,注意用while(getchar()!='(');scanf("%d,%d),%d");然后增加超源点与超收点。我是用dinic算法,速度慢,跑了549貌似ms,貌似,希望能优化,用个什么预流推进算法试试啊。在纠结了很久后,终于在书上把预流推进算法抄下来了,哈哈,调试了很久,一直陷入死循环,后来一看输入文件不是这个题的输入,想shi啊,有木有贴代码 dinic 算法 :View Code 1 #include <cstdio> 2 #include <cstring> 3 #define MAXN 10 阅读全文

posted @ 2013-04-09 15:43 allh123 阅读(180) 评论(0) 推荐(0)

POJ 2112 Optimal Milking dinic算法 网络流+二分
摘要:思路就是先用floyd算出奶牛到挤奶器的最短距离,然后二分查找最大距离的最小值,构造出满足任何奶牛到挤奶器的距离都小于该最小值的网络流,求一个最大流,如果该值等于奶牛的数目,就是可行方案,然后最小值还可以少点,如果不可行,最小值得增大。加入超源点与超收点,超源点到每头奶牛建边,容量为1,每个挤奶器到超收点建边,容量为m。其实这题用二分匹配判可行会更好。求网络的最大流用的是dinic算法,不太理解,抄的书上的代码。以下为代码:View Code 1 #include <cstdio> 2 #include <cstring> 3 #define INF 300000000 阅读全文

posted @ 2013-04-09 13:22 allh123 阅读(226) 评论(0) 推荐(0)

POJ 1273 Drainage Ditches 一般增广路算法,网络流
摘要:看到Ci最大可以到10 000 000,N<=200,M<=200,我以为用这个算法会超时,据说该算法的复杂度是N*M*C,C为最大流量值。但是显然没超,可能是数据弱神马的,不知道没什么思路说的,就是裸的网络最大流,我的代码和上一个题 pigs(麦克卖猪)的代码基本上相同,下面贴代码:View Code 1 #include <cstdio> 2 #include <cstring> 3 #define MAXN 205 4 #define MAXM 205 5 #define INF 300000000 6 struct Arc 7 { 8 int c,f 阅读全文

posted @ 2013-04-08 20:25 allh123 阅读(187) 评论(0) 推荐(0)

PIGS POJ 1149 网络流
摘要://以顾客为点,再添加超源点与超收点,如果顾客i是第一个打开j猪圈的,那么从超源点到顾客i有一条边,//容量为猪圈j中猪的数目.如果出现重边,和合并,容量值相加。//如果顾客i紧接着顾客j打开猪圈k,则顾客 i可以想顾客j连一条边,容量为正无穷//从每个顾客向超收点连一条边,容量为每个顾客想买的猪的数目。//这个网络流从0流开始增广View Code 1 #include <cstdio> 2 #include <cstring> 3 #define MAXN 107 //顾客数 4 #define MAXM 1007//猪圈数 5 #define INF 300000 阅读全文

posted @ 2013-04-08 19:37 allh123 阅读(173) 评论(0) 推荐(0)

ZOJ 1508 poj 1201 Intervals 差分约束系统
摘要:比较巧妙的是令s[i]为集合Z中小于等于i的元素个数。则得到不等式组s[ai-1] - s[bi] <= -ci;还有隐含条件s[i] - s[i-1] <=1 && s[i]-s[i-1] >= 0用Bellman写感觉还不错,清晰明了。抄书上的思路的。贴代码:View Code 1 #include <cstdio> 2 #include <cstring> 3 #define MAXN 50005 4 int n,min,max; 5 struct Arc 6 { 7 int u,v,w; 8 } edge[MAXN]; 9 in 阅读全文

posted @ 2013-04-04 19:51 allh123 阅读(188) 评论(0) 推荐(0)

Fleury 求欧拉回路
摘要:思想就是有别的选择就不走桥。加一个dfs.看代码自行理解,我也没理解完全。欧拉回路或欧拉通路的判别定理:度为奇数的顶点数目为2或0,为2有欧拉通路,起点和终点就是度为奇数的点,为0有欧拉回路,起点任意。View Code 1 #include <cstdio> 2 #include <cstring> 3 #define MAXN 100 4 bool edge[MAXN][MAXN]; 5 int n; 6 int mystack[MAXN]; 7 int top; 8 void dfs(int x) 9 {10 int i;11 mystack[top++] = x 阅读全文

posted @ 2013-04-03 00:40 allh123 阅读(178) 评论(0) 推荐(0)

Burn the Linked Camp ZOJ 2770 差分约束系统 SPFA
摘要:这个题是建立一个差分约束系统的模型,设前i个营的实际总人数为si,则根据题意,可得每个营的人数s[i] - s[i-1] <= c[i], i = 1,2......n他会给m个估计,s[j] - s[i-1] >= k,即s[i-1] - s[j] <= -k.然后还有一个约束就是每个营的人数要大于等于0, 即s[i] - s[i-1] >= 0,也就是说 s[i-1] - s[i] <=0.考虑一个三角形,任意两边只和大于第三边,再加上三条线共线,换种说法:已知一个源点,源点到每个点都有路,整个图连通,有边<u,v>从源点到顶点v的最短路一定< 阅读全文

posted @ 2013-04-03 00:36 allh123 阅读(179) 评论(0) 推荐(0)

Wormholes POJ 3259 SPFA 判断是否出现了负权值回路
摘要:这个题是判断有没有一条权值为负的回路,用SPFA是OK的,如果某个顶点重复入队列N次,就证明存在负权值回路。如果这个图是一个连通图,那么任意选择一点开始搜都行,但是如果该图不连通,那么我认为从从所有虫洞的起点都搜一遍是个不错的选择。不过是不是我应该默认一个农场嘛,应该会是连通的。。。。。但是我只从顶点1开始判断,也AC了,只是老感觉不严谨,也许是测试数据弱吧希望能用邻接表存,邻接矩阵存的话,复杂度提高了,顶点有500个,边只有2500+200条,算稀疏图了吧如果一定要用邻接矩阵存的话,注意一下重边的情形,选择时间花费最少的应该总是正确答案。贴代码:View Code 1 #include &l 阅读全文

posted @ 2013-04-02 13:14 allh123 阅读(244) 评论(0) 推荐(0)

Silver Cow Party POJ 3268 SPFA
摘要:这个题我是这么做的,本来想用Floyd写,但是看到n 2 #include 3 #include 4 #define MAXN 1005 5 #define INF 1000000 6 using namespace std; 7 int n; 8 int num[2][MAXN]; 9 int time[2][MAXN];10 bool s[MAXN];11 struct ArcNode12 {13 int v,w;14 } edge[2][MAXN][MAXN];15 void SPFA(int vo,int ser)16 {17 int i,j;18 queu... 阅读全文

posted @ 2013-04-01 20:58 allh123 阅读(122) 评论(0) 推荐(0)

ZOJ 1092 POJ 2240 Arbitrage Floyd
摘要:裸的Floyd做,感觉Floyd复杂度还挺高的,有O(n^3),适合顶点少的情形。这里先是求任意两种钱的汇率的最大值,就是一单位这种钱能换多少单位那种钱的最大的换法。在算路径时用乘法不用加法,对角线上的元素为1,自己换自己当然是1,不能换的取值为0,最后对角线上的值大于1了输出yes,否则输出no.贴代码:View Code 1 #include <cstdio> 2 #include <cstring> 3 #define INF 1000000 4 #define MAXN 32 5 double A[MAXN][MAXN]; 6 int n; 7 void Flo 阅读全文

posted @ 2013-04-01 20:46 allh123 阅读(168) 评论(0) 推荐(0)

1 2 下一页

导航