摘要: http://acm.hdu.edu.cn/showproblem.php?pid=4081我就不说题意了,为了使A/B最大,就应该是B越小,故可以先求出n个点的最小生成树。因此,可以枚举每一条边,假设最小生成树的值是B, 而枚举的那条边长度是edge[i][j], 如果这一条边已经是属于最小生成树上的,那么最终式子的值是A/(B-edge[i][j])。如果这一条不属于最小生成树上的, 那么添加上这条边,就会有n条边,那么就会使得有了一个环,为了使得它还是一个生成树,就要删掉环上的一棵树。 为了让生成树尽量少,那么就要删掉除了加入的那条边以外,权值最大的那条路径。 假设删除的那个边的权值是M 阅读全文
posted @ 2013-02-04 20:10 ihge2k 阅读(1929) 评论(0) 推荐(1) 编辑
摘要: 判断最下生成树是否唯一的思路:1、对图中的每一条边,扫描其他边,如果存在相同权值的边,则对该边做标记。2、然后用Kruskal算法或Prim算法求MST。3、求得MST后,如果该MST中未包含做了标记的边,即可判断MST唯一;如果包含做了标记的边,则依次去掉这些边再求MST,如果求得的MST权值和原来的MST的权值一样,即可判断MST不唯一。针对poj 1679这题,采用Kruskal算法求MST,并判断MST是否唯一:代码如下:View Code 1 #include<iostream> 2 #include<cstdio> 3 #include<algorit 阅读全文
posted @ 2013-02-03 22:02 ihge2k 阅读(1912) 评论(0) 推荐(0) 编辑
摘要: http://acm.hdu.edu.cn/showproblem.php?pid=3367求pseudoforest伪森林,要求每个连通分量最多可以有一个环。求能构成的最大值我是用kruskal的方法按照求最大生成树那样求的,只不过要加一个判断,就是判断两颗子树是够成环,如果各成环,就不能合并,如果只有其中一个成环或者都不成环,那么就可以合并,并对其进行标记。。。View Code 1 #include 2 #include 3 #include 4 #include 5 const int N=10010; 6 using namespace std; 7 8 int n,m; 9 i.. 阅读全文
posted @ 2013-02-03 21:29 ihge2k 阅读(481) 评论(0) 推荐(0) 编辑
摘要: http://acm.hdu.edu.cn/showproblem.php?pid=2489题目大意是有n个顶点的无向完全图,要你选m个点,使得m个点构成的图的m-1条边的权重之和比上m个点的值的和最小,即Sum(edge weight)/Sum(point weight)最小;由于题目的数据很小,因此我就直接暴力了。。。就是从n个点中先选m个点,对应一个最小值,然后对这m个点进行搜索就可以了。。。如果一开始就从第一个点就开始dfs,那么就可以保证最后的结果就是题目要求的。。。View Code 1 #include<iostream> 2 const int N=20; 3 co 阅读全文
posted @ 2013-02-03 20:27 ihge2k 阅读(293) 评论(0) 推荐(0) 编辑
摘要: http://www.cppblog.com/RyanWang/archive/2010/01/25/106427.html简单来说,就是有向的最小生成树:1、每个点找其最小的入边In[v] ? 如果有除跟节点以外的点找不到入边,则无解 : 否则答案累加In[v]2、看看有没有环 ? 无环则已经找到解,返回答案 : 将环缩点3、重新构图,每条边[u->v]的权值减去In[v],然后重复第一步模板题:hdu 2121:View Code 1 #include 2 #include 3 const int N=1010; 4 const int inf=10000000; 5 usin... 阅读全文
posted @ 2013-02-03 17:31 ihge2k 阅读(556) 评论(0) 推荐(0) 编辑
摘要: http://acm.hdu.edu.cn/showproblem.php?pid=1232完全就是并查集的应用啊。。。View Code 1 #include<iostream> 2 const int N=1010; 3 using namespace std; 4 5 int n,m; 6 int parent[N]; 7 8 //初始化 9 void UFset(){10 for(int i=1;i<=n;i++){11 parent[i]=-1;12 }13 }14 //找根结点15 int Find(int x){16 int s;17... 阅读全文
posted @ 2013-02-02 21:23 ihge2k 阅读(199) 评论(0) 推荐(0) 编辑
摘要: 通过这道题,我只想要说图论的题,建好了图,题就解了一大半了。。。这道题建好图后,dfs暴搜就行了。。。View Code 1 #include<iostream> 2 #include<cstring> 3 const int N=60; 4 using namespace std; 5 6 int n,m; 7 char map[N][N]; 8 int visited[N][N]; 9 int dir[4][2]={{-1,0},{0,1},{1,0},{0,-1}};//up/right/down/left10 int pip[11][4]={{1,0,0,1}, 阅读全文
posted @ 2013-02-02 20:42 ihge2k 阅读(218) 评论(0) 推荐(0) 编辑
摘要: 要熟练应用差分约束还是很困难的。。。题目的大意是:在每个区间[ai,bi]上至少选择ci个元素,构成一个集合S,使集合S中的元素最少;不妨设f(a)为区间[0,a]上的选择的元素个数;那么,由题意有f(b)-f(a-1)>=c,并且0<=(f(a)-f(a-1))<=1;从而建图;View Code 1 #include<iostream> 2 #include<queue> 3 #include<cstring> 4 const int N=50004; 5 const int Max=1000000; 6 using namespace 阅读全文
posted @ 2013-02-02 14:43 ihge2k 阅读(324) 评论(0) 推荐(0) 编辑
摘要: 对菜鸟来说题目有三种:会算法且能AC的,会算法但不能AC的,不会做的对大牛来说题目有两种:会做的,不会做的对教主来说题目有两种:能AC的,数据有错的菜鸟提交WA了,找了N久找不出错时,在论坛大骂数据有错,但是没人理大牛提交WA了,找了N久找不出错时,写暴力程序或者求别人的AC程序对拍教主提交WA了,Judge马上修正数据菜鸟面对一道难题,直接暴搜大牛面对一道难题,算了算时间复杂度不对,或者证明出是NP难,果断放弃教主面对一道难题,说,虽然我不会做,但AC还是没有问题的菜鸟AC了一道难题,巴不得召告天下大牛AC了一道难题,会写一篇解题报告,第一句话一定是:这题其实不难教主AC了一道难题,好像什么 阅读全文
posted @ 2013-02-02 13:20 ihge2k 阅读(129) 评论(0) 推荐(0) 编辑
摘要: 这也是我第一次碰到差分约束的题。。。好吧。。。赶紧学一下吧。。差分约束系统:假设有这样一组不等式:x1-x2<=0;x1-x5<=-1;x2-x5<=1;x3-x1<=5;x4-x1<=4;x4-x3<=-1;。。。。每个不等式都是有两个未知数的差小于等于某个常数(大于等于也可以,只要两边同乘以-1就可以了),这样的不等式组就称作差分约束系统(这个不等式组要么无解,要么有无数组解,因为若(x1,x2,x3....)是一组解,那么(x1+k,x2+k,x3+k,...)也必然是一组解);差分约束系统与最短路径的关系:差分约束系统的求解可以利用单源最短路径中的三 阅读全文
posted @ 2013-02-01 23:40 ihge2k 阅读(438) 评论(0) 推荐(1) 编辑