02 2013 档案

摘要:弱的一笔啊!!都知道这题是欧拉路径都还Wa了那么久。。。伤心!原来欧拉路径的压栈一定要在dfs()之后压。。。这题就是将牌骨的数字看做点,把牌看做连接两点的边。。。这样就成了欧拉路了// File Name: 1002.cpp// Author: zlbing// Created Time: 2013/2/24 11:39:49#include<iostream>#include<string>#include<algorithm>#include<cstdlib>#include<cstdio>#include<set> 阅读全文
posted @ 2013-02-28 14:44 z.arbitrary 阅读(208) 评论(1) 推荐(0)
摘要:刘汝佳新书---训练指南题意:给定一个N*N矩阵,每个格子里都有一个正整数w[i][j]。你的任务是给每行确定一个整数row[i],每列确定一个整数col[i],使得对于任意格子(i,j),w[i][j]《=row[i]+col[j]。所有row[i]和col[i]之和应尽量小。分析:这题是KM算法的一个副产品,KM算法有等式l(x)+l(y)>=w(x,y).// File Name: 11383.cpp// Author: zlbing// Created Time: 2013/2/27 23:37:40#include<iostream>#include<stri 阅读全文
posted @ 2013-02-27 23:58 z.arbitrary 阅读(254) 评论(0) 推荐(0)
摘要:假定有一个完全二分图G,每条边有一个权值(可以是负数),如何求出权值和最大的完美匹配?KM算法也称匈牙利算法int Left[MAXN];int w[MAXN][MAXN];int Lx[MAXN],Ly[MAXN];bool S[MAXN],T[MAXN];int N;bool match(int i){ S[i]=true; for(int j=1;j<=N;j++)if(Lx[i]+Ly[j]==w[i][j]&&!T[j]) { T[j]=true; if(Left[j]==0||match(Left[j])) { ... 阅读全文
posted @ 2013-02-27 23:20 z.arbitrary 阅读(189) 评论(0) 推荐(0)
摘要:刘汝佳新书--训练指南KM算法,求最佳完美匹配题意:给出N个白点和N个黑点,要求用N条不相交的线段把它们连接起来,其中每条线段恰好连接一个白点和一个黑点,每个点恰好连接到一条线段。分析:因为有结点黑白两色,我们不难想到构造一个二分图,其中每个白点对应一个X结点,每个黑点对应一个Y结点,每个黑点和每个白点相连,权值等于二者的欧几里德距离。建模后最佳完美匹配就是问题的解。为什么呢?假设在最佳完美匹配中有两条线段a1-b1与a2-b2相交,那么dist(a1,b1)+dist(a2,b2)一定大于dist(a1,b2)+dist(a2,b1),因此如果把这两条改成a1-b2和a2-b1后总长度会变少 阅读全文
posted @ 2013-02-27 23:14 z.arbitrary 阅读(1297) 评论(0) 推荐(1)
摘要:裸的最小点覆盖数最小点覆盖数=二分图最大匹配数// File Name: 3041.cpp// Author: zlbing// Created Time: 2013/2/27 20:35:34#include<iostream>#include<string>#include<algorithm>#include<cstdlib>#include<cstdio>#include<set>#include<map>#include<vector>#include<cstring>#inc 阅读全文
posted @ 2013-02-27 21:05 z.arbitrary 阅读(164) 评论(0) 推荐(0)
摘要:裸的最小路径覆盖最小路径覆盖=顶点数-二分图最大匹配// File Name: 1422.cpp// Author: zlbing// Created Time: 2013/2/27 19:20:35#include<iostream>#include<string>#include<algorithm>#include<cstdlib>#include<cstdio>#include<set>#include<map>#include<vector>#include<cstring># 阅读全文
posted @ 2013-02-27 19:44 z.arbitrary 阅读(180) 评论(0) 推荐(0)
摘要:http://blog.csdn.net/sdj222555/article/details/7426592大意就是有n个人,每个人与其他的某几个人有关系,这个关系且称为浪漫关系,然后最后求一个最大的集合,使得集合中所有的人两两之间都不存在浪漫关系。看到之后就可以发现,这是一道非常明显的最大独立集的问题,可以转化为二分图来做,还是最经典的拆点建图,然后根据定理,最大独立集=顶点数-最小点覆盖数。 而对于这道题来说,我们可以发现这个浪漫关系是相互的。而我们的建图中,按理来说应该是一边是男的点,一边是女的点这样连边,但是题目中没说性别的问题。只能将每个点拆成两个点,一个当作是男的点,一个当作是女的 阅读全文
posted @ 2013-02-24 01:15 z.arbitrary 阅读(228) 评论(0) 推荐(0)
摘要:二分图最大匹配每个学生只能代表一个课程,每个课程最多有一个代表。问能否合法。最大匹配数等于课程则输出“YES”。// File Name: 1469.cpp// Author: zlbing// Created Time: 2013/2/23 22:15:52#include<iostream>#include<string>#include<algorithm>#include<cstdlib>#include<cstdio>#include<set>#include<map>#include<vect 阅读全文
posted @ 2013-02-24 00:08 z.arbitrary 阅读(220) 评论(0) 推荐(0)
摘要:RT 阅读全文
posted @ 2013-02-23 22:37 z.arbitrary 阅读(186) 评论(2) 推荐(0)
摘要:摘自http://www.cnblogs.com/kuangbin/archive/2012/08/26/2657446.html二分图匹配(匈牙利算法)1。一个二分图中的最大匹配数等于这个图中的最小点覆盖数König定理是一个二分图中很重要的定理,它的意思是,一个二分图中的最大匹配数等于这个图中的最小点覆盖数。如果你还不知道什么是最小点覆盖,我也在这里说一下:假如选了一个点就相当于覆盖了以它为端点的所有边,你需要选择最少的点来覆盖所有的边。2。最小路径覆盖=最小路径覆盖=|G|-最大匹配数注意:最小路径覆盖不适用于非DAG的有向图在一个N*N的有向图中,路径覆盖就是在图中找一些路经 阅读全文
posted @ 2013-02-23 21:32 z.arbitrary 阅读(211) 评论(0) 推荐(0)
摘要:刘汝佳新书--训练指南题意:你需要花费不超过cost元来搭建一个比赛网络。网络中有n台机器,编号0~n-1,其中机器0为服务器,其他机器为客户机。一共有m条可以使用的网线,其中第i条网线的发送端是机器ui,接收端是机器vi(数据只能从机器ui单向传输到机器vi),带宽是bi Kbps,费用是ci元。每台客户机应当恰好从一台机器接收数据。你的任务是最大化网络中的最小带宽。分析:最小树形图,然后二分答案最小带宽。// File Name: 11865.cpp// Author: zlbing// Created Time: 2013/2/17 22:36:04#include<iostrea 阅读全文
posted @ 2013-02-17 23:43 z.arbitrary 阅读(641) 评论(0) 推荐(0)
摘要:最小树形图http://blog.csdn.net/wsniyufang/article/details/6747392题意:给出一个有向图,求以root为根的最小树形图// File Name: 3164.cpp// Author: zlbing// Created Time: 2013/2/17 18:46:24#include<iostream>#include<string>#include<algorithm>#include<cstdlib>#include<cstdio>#include<set>#inclu 阅读全文
posted @ 2013-02-17 22:32 z.arbitrary 阅读(190) 评论(0) 推荐(0)
摘要:刘汝佳新书--训练指南题意:秦朝有n个城市,需要修建一些道路使得任意两个城市之间都可以连通。道士徐福声称他可以用法术修路,不花钱,也不用劳动力,但只能修一条路,因此需要慎重选择用那一条路。秦始皇不仅希望其他道路总长度B尽量短,还希望法术连接的两个城市的人口之和A尽量大,因此下令寻找一个使A/B最大的方案。你的任务是找出这个方案分析:先求出最小生成树,在枚举边u-v之后删除最小生成树中u和v之间唯一路径上的最大权maxcost[u][v]。只需在预处理时用O(n^2)时间算出maxcost数组,问题得到解决// File Name: 1494.cpp// Author: zlbing// Cre 阅读全文
posted @ 2013-02-17 15:55 z.arbitrary 阅读(377) 评论(0) 推荐(0)
摘要:刘汝佳新书--训练指南题意:给定一个有向图,每条边都有一个权值。每次你可以选择一个结点v和一个整数d,把所有以v为终点的边的权值减小d,把所有以v为起点的边的权值增加d,最后让所有边的权值的最小值大于零且尽量大。分析:因为不同的操作互不影响,因此可以按任意顺序实施这些操作。另外,对于同一个点的多次操作可以合并,因此可以令sum(u)为作用于结点u之上的所有d之和。这样,本题的目标就是确定所有的sum(u),使得操作之后所有边权的最小值尽量大。“最小值最大”使用二分答案的方法。二分答案x之后,问题转化为是否可以让操作完毕后每条边的权值均不小于x。对于边a->b,不难发现操作完毕后它的权值为 阅读全文
posted @ 2013-02-15 15:10 z.arbitrary 阅读(710) 评论(0) 推荐(1)
摘要:题意:给定一个n个点m条边的加权有向图,求平均权值最小的回路。分析:使用二分法求解。对于一个猜测值mid,只需要判断是否存在平均值小于mid的回路。如何判断呢?假设存在一个包含k条边的回路,回路上各条变的权值为w1,w2,....,wk,那么平均值小于mid意味着w1+w2+....+wk《K*mid,即:(w1-mid)+(w2-mid)+...+(wk-mid)<0换句话说,只要把每条边(a,b)的全w(a,b)变成w(a,b)-mid,再判断新图中是否有负权回路即可。// File Name: 11090.cpp// Author: zlbing// Created Time: 2 阅读全文
posted @ 2013-02-15 00:31 z.arbitrary 阅读(478) 评论(0) 推荐(0)
摘要:struct Edge{ int from,to; int dist;};struct BellmanFord{ int n,m; vector<Edge>edges; vector<int>G[MAXN]; bool inq[MAXN]; int d[MAXN]; int p[MAXN]; int cnt[MAXN]; void init(int n) { this->n=n; for(int i=0;i<n;i++)G[i].clear(); edges.clear(); } ... 阅读全文
posted @ 2013-02-15 00:17 z.arbitrary 阅读(200) 评论(0) 推荐(0)
摘要:题意:jimmy下班需要穿过一个森林。劳累一天后在森林中漫步是见非常惬意的事,所以他打算每天沿着不同的路径回家,欣赏不同的风景。但他也不想太晚回家,因此他不打算走回头路。换句话说,他只沿(A,B)走,存在一条从B出发回家的路径比所有从A出发回家的路径都短。你的任务是计算一共有多少条不同的回家路径分析:用dijkstra计算家到各个点的最短路径,则当d[i]>d[j],则有一条i-->j的路可走,因此形成了一个新图,且是DAG图。故可用动态规划计算方案。(使用记忆化搜索)// File Name: 2662.cpp// Author: zlbing// Created Time: 2 阅读全文
posted @ 2013-02-06 22:40 z.arbitrary 阅读(412) 评论(0) 推荐(0)
摘要:struct Edge{ int from,to,dist;};struct HeapNode{ int d,u; bool operator <(const HeapNode &rhs)const{ return d>rhs.d; }};struct Dijkstra{ int n,m;//点和边数 vector<Edge>edges;//边列表 vector<int>G[MAXN];//每个节点出发的边编号(从0开始编号) bool done[MAXN];//是否永久标记 int d[MAXN];//s到各个点的距离 ... 阅读全文
posted @ 2013-02-06 18:35 z.arbitrary 阅读(193) 评论(0) 推荐(0)
摘要:题意:在Iokh市中,机场快线是市民从市内去机场的首选交通工具。机场快线分为经济线和商业线两种,线路,速度和价钱都不同。你有一张商业线车票,可以做一站商业线,而其他时候只能乘坐经济线。假设换乘时间忽略不计,你的任务是找一条去机场最快的路线。。分析:枚举商业线T(a,b),则总时间为f(a)+T(a,b)+g(b);f和g用两次dijkstra来计算,以S为起点的dijkstra和以E为起点的dijkstra;// File Name: 11374.cpp// Author: zlbing// Created Time: 2013/2/6 13:29:09#include<iostream 阅读全文
posted @ 2013-02-06 18:32 z.arbitrary 阅读(1452) 评论(0) 推荐(1)
摘要:POJ 2-sat六题最后一题http://blog.sina.com.cn/s/blog_64675f540100k2xf.htmlpoj 六道2-sat最后一题第六题:题目描述:有n个农场,每个农场有坐标x,y。有两个集合点s1和s2(也有坐标),每个农场必须连接其中的一个(有且仅有一个)。然后有A个条件,每个条件a,b表示a农场不能和b农场连接在一个集合点。然后再有B个条件,每个条件a,b表示a农场必须和b农场连接在一个集合点。问你,在各种合法的连接情况中,任何两个农场间的距离的最大值的最小值是多少。解题报告:每个农场i分成两个点,i和i + n,前面表示连接左侧集合点,后面的表示连接右 阅读全文
posted @ 2013-02-05 23:02 z.arbitrary 阅读(232) 评论(0) 推荐(0)
摘要:POJ 2-sat六题之五http://blog.sina.com.cn/s/blog_64675f540100k2rh.html题目描述:有2n把钥匙,分成2组,给你每组的钥匙信息,并且每组的钥匙只能用一个。有m个门,每个门有2个锁,只要打开一个锁这个门就开了。(顺序遇见m个门)问你最多能够打开多少个门。解题报告:2n个钥匙,定义4n个节点,1~2n中的i表示用第i个钥匙。 2n+1~4n中的j, 表示不用j - 2n号钥匙。那么对与给你的n组钥匙的每一组a和b。有边<a, b + 2n> 和 <b, a + 2n>(只能选一个钥匙)对于给你的m个门的两个锁a和b有边 阅读全文
posted @ 2013-02-05 16:07 z.arbitrary 阅读(216) 评论(0) 推荐(0)