雕刻时光

just do it……nothing impossible
随笔 - 547, 文章 - 0, 评论 - 82, 阅读 - 86万
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

02 2011 档案

摘要:学习了种类并查集,又学了离散化STL里的map容器这几题里比较侧重对find()函数的理解View Code #include<iostream>#include<map>using namespace std;#define N 10005int f[N];int r[N];map<int,int>mm;int find(int pos){ if(f[pos]==-1) return pos; int t=f[pos]; f[pos]=find(f[pos]);//使f[pos]路径压缩,指向最终根节点 r[pos]=(r[pos]+r[t])%2;//r 阅读全文

posted @ 2011-02-28 22:15 huhuuu 阅读(294) 评论(0) 推荐(0) 编辑

摘要:把点与点的关系保存在连接矩阵里就好了,如果距离小于等于规定距离的话就赋值为1然后不断做(做符合条件)合并操作即可……View Code #include<stdio.h>#define N 1005int f[N];int d;int ji[N];struct data { int x,y;}p[N];bool map[N][N];int dis(data a,data b){ int temp=(a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y); if(temp<=(d*d)) return 1; return 0;}int find(int p 阅读全文

posted @ 2011-02-27 18:51 huhuuu 阅读(161) 评论(0) 推荐(0) 编辑

摘要:这道题目,理解了好久,其实只要把关系图画一下,有些概念自然就知道了……当然也使我明白了,并查集因为通过路径压缩后,一个节点的find()过程,最多需要2次递归,最多一次修改……这样题目就理解了……View Code #include <stdio.h>#define max 50000+5int f[max];int r[max];/*rank[x]表示father[x]与x的关系rank[x] == 0 表示father[x]与x是同类rank[x] == 1 表示x吃father[x]rank[x] == 2 表示father[x]吃x*/void make_set(int x 阅读全文

posted @ 2011-02-27 15:33 huhuuu 阅读(312) 评论(0) 推荐(0) 编辑

摘要:View Code #include<stdio.h>#define N 2009int e[N];int f[N];int find(int pos){ if(f[pos]==-1)return pos; return f[pos]=find(f[pos]);}int un(int a,int b){ int fa=find(a),fb=find(b); if(fa==fb)return 0; f[fa]=fb;return 1;}int main(){ int t,n,m,rt,a,b,ca=0,i,T; scanf("%d",&T); t=T; w 阅读全文

posted @ 2011-02-25 16:08 huhuuu 阅读(238) 评论(0) 推荐(0) 编辑

摘要:这道题目oj比较奇怪,用g++提交可以,c++就不行了……思路:e[]保存敌人输入时:d,x,y时fx=find(x),fy=find(y)如果e[fx]==-1;e[fx]=fy否则 合并(e[fx],fy);对fy再做如上操作View Code #include<stdio.h>#include<iostream>using namespace std;#define N 100009int f[N];int e[N];int find(int pos){ if(f[pos]==-1)return pos; else f[pos]=find(f[pos]);}int 阅读全文

posted @ 2011-02-24 21:40 huhuuu 阅读(310) 评论(0) 推荐(0) 编辑

摘要:View Code #include<stdio.h>int f[30009];int find(int pos){ if(f[pos]==-1)return pos; return f[pos]=find(f[pos]);}int un(int a,int b){ int fa=find(a),fb=find(b); if(fa==fb)return 0; f[fa]=fb; return 1;}int main(){ int n,m,i,j,add,one,temp; while(scanf("%d%d",&n,&m),n||m) { for 阅读全文

posted @ 2011-02-24 14:39 huhuuu 阅读(266) 评论(0) 推荐(0) 编辑

摘要:空树也是树,森林不是树……还有注意ca++,大囧……View Code #include<stdio.h>int f[109];int jin[109];int find(int pos){ if(f[pos]==-1)return pos; return f[pos]=find(f[pos]);}int un(int a,int b){ int fa=find(a),fb=find(b); if(fa==fb)return 0; f[fa]=fb;return 1;}int main(){ int i,j,ca=0; while(1) { ca++; for(i=1;i<= 阅读全文

posted @ 2011-02-22 22:21 huhuuu 阅读(186) 评论(0) 推荐(0) 编辑

摘要:略有难度的最小生成树问题:先排序算出某一长度的边有几条,放到tong[],再用krus求某一长度的边需要几条,xu[],再用枚举的方法举例出某一长度的符合条件为几条(再枚举下一种边时。把边覆盖上),分别为f1,f2,f3……再把f1,f2,f3相乘……(当然乘的过程不要忘了mod31011)ps:比较郁闷的是数组开小了,一直wa,稍微开大点TLE,再开大,AC……我就奇怪为什么别人的程序数组开小没问题,囧……其实还有一种矩阵的解法,速度更快……自己看看论文 阅读全文

posted @ 2011-02-21 21:04 huhuuu 阅读(872) 评论(0) 推荐(0) 编辑

摘要:贪心的方法:每次将顶点度数排序,依次将度较大的点的度数减一;再排序再减……直到某点的度小于0时说明无解输出,或者所有点的度数都为零输出View Code 阅读全文

posted @ 2011-02-20 14:32 huhuuu 阅读(195) 评论(0) 推荐(0) 编辑

摘要:一开始还mlt,纳闷,看了discuss才知道数据不是有规律的,他们之间可能有多个空格……所以用cin输入View Code 阅读全文

posted @ 2011-02-20 10:11 huhuuu 阅读(296) 评论(0) 推荐(0) 编辑

摘要:我的思路是多次执行krusk,通过枚举比较产生最小minps:一般用g++提交要加上#include<stdio.h>(貌似废话了^ ^)View Code 阅读全文

posted @ 2011-02-20 09:29 huhuuu 阅读(392) 评论(0) 推荐(1) 编辑

摘要:View Code 阅读全文

posted @ 2011-02-19 21:09 huhuuu 阅读(296) 评论(0) 推荐(0) 编辑

摘要:从点的角度考虑,因为要使男女的点都要经过,所以男的点要是加上女生的人数的人数,遍历只要生成最大生成树,树的路径和就是可以节约的钱了……kruskal+并查集,效率较高ps:要是不加#include<iostream>的话,用c++提交会有错,g++就没事,所以用c++提交不要忘了加上#include<iostream>View Code 阅读全文

posted @ 2011-02-19 10:01 huhuuu 阅读(592) 评论(0) 推荐(0) 编辑

摘要:水题……View Code 阅读全文

posted @ 2011-02-18 15:46 huhuuu 阅读(297) 评论(0) 推荐(0) 编辑

摘要:水题……View Code 阅读全文

posted @ 2011-02-18 15:28 huhuuu 阅读(321) 评论(0) 推荐(0) 编辑

摘要:求最小树,map[][]初始都为MAX求最大树,map[][]初始都为0,prim函数再改下就ok了判断全树是通过判断顶点是否都遍历了,即use[]1到n是否都为1View Code 阅读全文

posted @ 2011-02-18 14:29 huhuuu 阅读(289) 评论(0) 推荐(0) 编辑

摘要:回过头来看看,与最小生成树PRIM算法太像太像……反正用dijk自己要随时注意重边的情况……View Code 阅读全文

posted @ 2011-02-18 13:49 huhuuu 阅读(721) 评论(0) 推荐(0) 编辑

摘要://printf("%.2lf\n",sqrt((double)a[s]));//以后用sqrt自己小心点,而且要用c++提交//郁闷到了没加double就一直错,不说了,而且g++提交也一直错,c++提交才对下次看到题目有说用sqrt的时候要小心了,因为精度而产生的问题是比较郁闷的ps:用vs2008它会会提示sqrt重载问题……以后有关精度问题时先在vs上运行试试……View Code 阅读全文

posted @ 2011-02-17 21:20 huhuuu 阅读(280) 评论(0) 推荐(0) 编辑

摘要:一次prim就秒杀……注意是无向图View Code 阅读全文

posted @ 2011-02-17 08:50 huhuuu 阅读(274) 评论(0) 推荐(0) 编辑

摘要:正反两次遍历最小生成树,把结果顶点的连通性结果分别放在hash[][],hash2[][]里,在比较若相同,则树唯一,反之不唯一View Code 阅读全文

posted @ 2011-02-16 22:33 huhuuu 阅读(556) 评论(0) 推荐(0) 编辑

摘要:用枚举算法做,思想还是比较简单的:(比较朴素的思想,没优化过)1、一共找n-1条边形成最小生成树{2、枚举i寻找第i条边是遍历过的点3、枚举j寻找第j条没被遍历过的点在枚举符合条件【i,j】的同时找出最短的边}//一共枚举了n-1,然后最小生成树就诞生了……时间复杂度是(顶点^3)PRIM思想:FOR()一点为起点,与所有点连线,距离保存在dis[]里,起点标记for(i->(n-1)) 一共连n-1条边{  FOR()//找dis[]最短的边  保存距离,标记  FOR()//更新没被标记的最短边,注意与最短路不同,dis[i]是保存到i的最短边,而最短路中 阅读全文

posted @ 2011-02-16 21:19 huhuuu 阅读(1661) 评论(0) 推荐(0) 编辑

摘要:差不多最短路的题目做的差不多了主要三种算法:1、FLOYD:个人比较喜欢使用,不但可以快速计算计算多源最短路,也可以判断图的连通性。时间复杂度是(顶点^3)2、DIJK:从点的角度计算单源最短路比较方便吧,可以用邻接表优化(没用过,呵呵)。时间复杂度(顶点^2(朴素),顶点*log(顶点))3、SPFA+静态邻接表+队列储存:是从边的角度计算单源最短路,比较牛逼的算法,因为时间复杂度比较小(边*k),其中K是常数,注意用前两种算法时,因为这两种算法是从顶点思考,所以要小心重边的情况(有时题目没说明但自己要小心),每次读取边取小即可,用SPFA就没关系了网上说K~2,不过实际使用时K估计接近10 阅读全文

posted @ 2011-02-16 18:12 huhuuu 阅读(2458) 评论(2) 推荐(1) 编辑

摘要:思路:可能从题意去解决问题比较棘手,换个角度,实际就是各个(顶点到根节点的最短路*该顶点的权值)的和,类似usaco2.4.4此题注意点:1、用int型会超范围,(50000*2^16)>(1<31)2、用SPFA算法是要注意无向图边的数量是题目所说边的两倍,因为这个看似简单的地方,RE了n久3、还有就是判断No Answer是只在节点到起点(也就是根节点)没有路时才成立,注意max==0时结果是0,不是No Answer!!!View Code 阅读全文

posted @ 2011-02-16 16:34 huhuuu 阅读(415) 评论(0) 推荐(0) 编辑

摘要:一般单源起点最短路顶点较多时我们会想到dijk来做,但是单源终点最短路时,要在枚举顶点,显然会超时这时,我们可以用矩阵转置思想,把出度,入度的路径倒过来,就又求了一次单源起点最短路……dijk做的View Code现在又用SPFA 0msView Code 阅读全文

posted @ 2011-02-16 10:18 huhuuu 阅读(365) 评论(0) 推荐(0) 编辑

摘要:其实用dijstra应该更快,可以把“Z”点看做起点,依次到其他点的距离求出即可,然后求最小,因为顶点时在50个左右,FLOYD又可以将其秒杀……不过要注意的是,大小写字母代表不同的地方……View Code 阅读全文

posted @ 2011-02-15 22:02 huhuuu 阅读(375) 评论(0) 推荐(0) 编辑

摘要:枚举起点n,用SPFA求最短路,然后求和,算出路径和最小点即可View Code 阅读全文

posted @ 2011-02-15 21:52 huhuuu 阅读(740) 评论(0) 推荐(0) 编辑

摘要:本来求多源最短路现在变成多源间最大障碍,同理,一看顶点才最多300,FLOYD将其秒杀,速度还不慢FLOYD真神了,既可以求多源最短路,亦可判断图的连通性,关键是代码实现简单……View Code 阅读全文

posted @ 2011-02-15 21:29 huhuuu 阅读(266) 评论(0) 推荐(0) 编辑

摘要:昂贵的聘礼http://acm.pku.edu.cn/JudgeOnline/problem?id=1062Stockbroker Grapevinehttp://acm.pku.edu.cn/JudgeOnline/problem?id=1125Invitation Cardshttp://acm.pku.edu.cn/JudgeOnline/problem?id=1511Currency Exchangehttp://acm.pku.edu.cn/JudgeOnline/problem?id=1860MPI Maelstromhttp://acm.pku.edu.cn/JudgeOnlin 阅读全文

posted @ 2011-02-15 20:46 huhuuu 阅读(196) 评论(0) 推荐(0) 编辑

摘要:http://poj.org/problem?id=3660题意就是确定奶牛的名次;先用FLOYD做出连通图,再判要是一个顶点的出度+入度==顶点点数(n)-1,就可以确定名次View Code下面是FLOYD的邻接表优化代码(转)不过我很奇怪他的效率还没我朴素FLOYD快View Code 阅读全文

posted @ 2011-02-15 20:44 huhuuu 阅读(428) 评论(0) 推荐(0) 编辑

摘要:floyd可以秒杀,虽然其时间复杂度是(n^3)但是n<=100,时间是0msView Code 阅读全文

posted @ 2011-02-15 14:36 huhuuu 阅读(245) 评论(0) 推荐(0) 编辑

摘要:http://poj.org/problem?id=2387SPFA模板换一种,n,m,就可过,其实是有重边的,用SPFA(它已包含所有边,他从边的角度思考最短路),但是用diskar做要小心(因为他是从点的角度思考,map[][]点对点要更新到最小化)View Code 阅读全文

posted @ 2011-02-15 13:44 huhuuu 阅读(296) 评论(0) 推荐(0) 编辑

摘要:主要优化通过静态链表的快速查找(用for()语句的话就会出现很多无谓的查找)用队列是为了(不在队列的可疏松点)方便存储,下次接着出队再进行可疏松检验,最终达到最短路View Code 阅读全文

posted @ 2011-02-15 08:57 huhuuu 阅读(407) 评论(0) 推荐(0) 编辑

摘要:[代码]//一开始以为只是两个牧场之间的(二分图),实际是存在多个联通图的,额//还有最重要的是不要以为所求的农场最大直径一定存在于新图建立之后,老图(没连上新边之前)也有可能存在最大直径,错了n久……View Code 阅读全文

posted @ 2011-02-15 08:47 huhuuu 阅读(344) 评论(0) 推荐(0) 编辑

摘要:[代码]http://www.rqnoj.cn/Problem_480.html这个比较适用,先把连通图保存在了g[][],在用floyd转化到直观连通图,在多个连通图存到map[][]中,特别的map[i][0]是放第i个连通图的顶点数,若定点为0,则把i放入map[i][1]View Code 阅读全文

posted @ 2011-02-14 10:14 huhuuu 阅读(609) 评论(0) 推荐(1) 编辑

点击右上角即可分享
微信分享提示