随笔分类 -  雁过留痕

摘要:题意:人与人交友构成关系网,两个人交友,相当于两个朋友圈的合并,问每个出两人,他们目前所在的关系网中的人数。分析:用并查集,其实就是求每个集合当前的人数。对于人名的处理用到了字典树。注意:1、题目给出的n是指n对关系,上限有2*n个人。 2、题目很没有意思的既说了有多组数据,又要求输入组数。实际上还是多组数据。 1 #include 2 #include 3 #include 4 using namespace std; 5 6 const int MAXN=200002; 7 8 struct Node{ 9 int c;10 Node *child[52];11 ... 阅读全文
posted @ 2013-10-24 13:39 Thousand Sunny 阅读(391) 评论(0) 推荐(0)
摘要:题意:略分析:排序先按rating,若相同,则按rp。考虑到每个人的rp均不同,所以rating相同的人必然可以排序。那么只需要考虑rating不同的集合了。 大小关系可以用有向边表示,而大小关系的传递可以用拓扑排序来呈现。 接着就要分析,三种结果对应的情况了。 很明显,ok要求拓扑出来的必须是一条链,一旦有分支,分支处的两个(或多个)点的大小关系就不明确,也就是条件不足=>uncertain。 而矛盾conflict有两种情况:1、更改关系0=1,0>1;2、自相矛盾,即成环,0>1,0 2 #include 3 #include 4 #include 5 #incl... 阅读全文
posted @ 2013-10-19 16:26 Thousand Sunny 阅读(213) 评论(0) 推荐(0)
摘要:题意:给出n个人的属性(a,b),当A(a,b)与B(a',b')存在关系:(ax1)查找,所有(y2>y1)的点(x2,y2)都失去优势,从集合中删除。注意:若左侧没有点it==s.begin(),必然可以加入。 1 #include 2 #include 3 using namespace std; 4 5 struct P{ 6 int x,y; 7 bool operator s;13 multiset::iterator it;14 15 int main()16 {17 int T,n;18 scanf("%d",&T);19 .. 阅读全文
posted @ 2013-10-16 15:03 Thousand Sunny 阅读(252) 评论(0) 推荐(0)
摘要:题意:我们常根据无向边来计算每个节点的度,现在反过来了,已知每个节点的度,问是否可图,若可图,输出一种情况。分析:这是一道定理题,只要知道可图定理,就是so easy了 可图定理:对每个节点的度从大到小排序,取第一个(最大)的度的节点,依次与其后(度)的节点连边,每连一条边,对应的度减1。然后重新排序,重复以上步骤,若度出现负值,则不可图。(若n个点中,某点的度>=n,那么也是不可能的) 1 #include 2 #include 3 #include 4 using namespace std; 5 6 const int MAXN=22; 7 8 int a[MAXN],r[MAX. 阅读全文
posted @ 2013-10-03 10:48 Thousand Sunny 阅读(302) 评论(0) 推荐(0)
摘要:题意:略过分析:用m个数字组成一个能够被n整除的c进制数的最小值,实际上本题的关键就在于这个最小值上。 首先确定我们的思路是从小到大寻找。先查看一位数,即查看着m个数字是否能被n整除;若不能,就查看任意可能的两位数组合...可是如此一来,预算量太大。于是我们考虑是否存在冗余量。 已知A,B两个数(A 2 #include 3 #include 4 #include 5 #include 6 using namespace std; 7 8 const int MAXN=5555; 9 const int N=22; 10 11 struct Node{ 12 ... 阅读全文
posted @ 2013-10-01 17:48 Thousand Sunny 阅读(460) 评论(0) 推荐(0)
摘要:题意:老师在选择一些学生做活动时,为避免学生发生暧昧关系,就提出了四个要求。在他眼中,只要任意两个人符合这四个要求之一,就不可能发生暧昧。现在给出n个学生关于这四个要求的信息,求老师可以挑选出的最大学生数量。分析: 1、这里的问题可以抽象成求最大独立集:若两人发生暧昧,则在两人中建边,当四个条件中任意一个成立,则将两个人孤立。老师选择的学生必然是两两之间不会发生暧昧的。 公式:最大独立集=顶点总数V-最小点覆盖 2、这里涉及到离散数学中一些集合的概念,理解起来对在下实属不易,所以就先记住吧。(定义也只是挑重要的记录下来) 独立集:该集合中的点,两两之间不相邻(没有边)(单独一个点就是独... 阅读全文
posted @ 2013-09-02 21:57 Thousand Sunny 阅读(267) 评论(0) 推荐(0)
摘要:题意:在方格图上打小怪,每次可以清除一整行或一整列的小怪,问最少的步数是多少,又应该在哪些位置操作(对输出顺序没有要求)。分析:最小覆盖问题 这是一种在方格图上建立的模型:令S集表示“行”,T集表示“列”,那么小怪站的位置w(i,j),就是二分图上的边。如此建图,那么每次清除,就是把与某个点相连的边全部清除,问最少选择多少个点。(这也是最小点覆盖的概念:选择尽量少的点,使得每条边至少有一个端点被选中) 这里有一个König定理:最大二分匹配数==最小覆盖点数。 既然是求最小点覆盖,那么自然是选那些所连边数多的点,不过貌似不好安排啊? 先从简单问题开始讨论:找到必然要选的点。对于一棵树 阅读全文
posted @ 2013-09-02 18:54 Thousand Sunny 阅读(760) 评论(0) 推荐(0)
摘要:题意:男女各n人,进行婚配,对于每个人来说,所有异性都存在优先次序,即最喜欢某人,其次喜欢某人...输出一个稳定婚配方案。所谓稳定,就是指未结婚的一对异性,彼此喜欢对方的程度都胜过自己的另一半,那么这对异性就有私奔的可能性。这里明显也是一个匹配问题,与最佳二分完美匹配所不同的是,二分匹配重在求最佳权值,而这里求的是满足彼此的要求。这里用到了Gale-Shapley算法。算法学习:http://wenku.baidu.com/view/964a503843323968011c92c3.html http://wenku.baidu.com/view/7aa841f2fab069dc502... 阅读全文
posted @ 2013-09-01 21:49 Thousand Sunny 阅读(1041) 评论(0) 推荐(0)
摘要:题意:计算机中有一些固定大小的内存,内存越大,处理速度越快。对于一个程序,加入不同的内存空间,处理所需时间不同。现给出m个内存空间,n个程序,对于每个程序程序,有k组数据(s,t),分别表示当程序 i 在某个内存环境s下对应的运行时间t。当有一个内存空间为si,一个程序的2组数据a,b,满足as最大内存空间)分析: 很复杂的题意,直观感觉就是所求的量很多,而且并非直接求最小值,是要具体的把方案求解出来。想到这里应该能确定用图论解决。进一步的,要用什么来处理,排除法也能想到匹配(其实我在刷图论专题= =)。 确定了算法,就明确了方向,一侧必然是n个程序。那么另一侧应该是什么呢?我们求的是平均.. 阅读全文
posted @ 2013-08-31 21:41 Thousand Sunny 阅读(679) 评论(0) 推荐(0)
摘要:事实再一次证明:本小菜在计算几何上就是个渣= =题意:平面上n个点(n 2 #include 3 #include 4 #include 5 #define rep(i,a,b) for(int i=a;i<=b;i++) 6 using namespace std; 7 8 const int MAXN=333; 9 const double eps=1e-10;10 11 struct Point{12 double x,y;13 Point(double _x=0,double _y=0):x(_x),y(_y){}14 }p[MAXN];15 16 typedef P... 阅读全文
posted @ 2013-08-31 17:38 Thousand Sunny 阅读(1062) 评论(0) 推荐(0)
摘要:题意:每个蚁群有自己的食物源(苹果树),已知蚂蚁靠气味辨别行进方向,所以蚁群之间的行动轨迹不能重叠。现在给出坐标系中n个蚁群和n棵果树的坐标,两两配对,实现以上要求。输出的第 i 行表示第 i 个蚁群应该去哪棵果树。(已知2*n个点互不重合)容易想到二分完美匹配,但究竟以什么为权值?需要利用一个关系:两条线段如果相交,那么线段长度之和必然大于其四个点不相交的连法对应的线段长度之和。(利用三角不等式可以证明)。如此,求出每个蚁群到每棵果树的曼哈顿距离,只要保证每条匹配边的长度最短,即长度之和最小,就可以得到不重叠的方案。注意: 1、通常意义上,二分图完美匹配求的是权值和最大的方案(初始的可行顶. 阅读全文
posted @ 2013-08-30 15:56 Thousand Sunny 阅读(324) 评论(0) 推荐(0)
摘要:题意:N台机器,M条有向边,总资金C,现要到搭建一个以0号机(服务器)为跟的网路,已知每条网线可以把数据从u传递到v,其带宽为d,花费为c,且d越大,传输速度越快,问能够搭建的传输速度最快的网络d值是多少?(即:在C的支持下,网络中d的最小值最大是多少?)一开始把问题想简单了,以为网线可以随便接,其实是确定了u->v的= =最小树形图,概念蛮好理解的,要学习的话理论:http://hi.baidu.com/bin183/item/5d93ef69ceb541176895e682代码标注的很详细:http://blog.csdn.net/hehedounima/article/detail 阅读全文
posted @ 2013-08-27 15:03 Thousand Sunny 阅读(364) 评论(0) 推荐(0)
摘要:题意:问图上任意两点(u,v)之间的路径上,所经过的最大边权最小为多少?求最小瓶颈路,既是求最小生成树。因为要处理多组询问,所以需要用倍增加速。先处理出最小生成树,prim的时间复杂度为O(n*n),kruskal为O(mlogm)。前者适合处理稠密图,后者适合处理稀疏图。这里的倍增处理是值得记住的,在树上做多组询问;亦或是,将无向图缩点在询问,都是可以这样加速的。注意:边权 2 #include 3 #include 4 #include 5 #include 6 #define clr(a,m) memset(a,m,sizeof(a)) 7 #define rep(i,a,b... 阅读全文
posted @ 2013-08-25 12:57 Thousand Sunny 阅读(476) 评论(0) 推荐(0)
摘要:题意:对于已知的网络构建道路,使城市两两之间能够互相到达。其中一条道路是可以免费修建的,问需要修建的总长度B与免费修建的道路所连接的两城市的人口之和A的比值A/B最大是多少。因为是求A/B的最大值,自然A越大,B越小越好。B的最小值是可以用最小生成树算法求解的,但是,由于免费修建一条道路,使得B值 2 #include 3 #include 4 #include 5 #include 6 #define clr(a,m) memset(a,m,sizeof(a)) 7 #define rep(i,a,b) for(int i=a;iq;26 double cnt=0;27 28 ... 阅读全文
posted @ 2013-08-25 10:28 Thousand Sunny 阅读(275) 评论(0) 推荐(0)
摘要:题意:模拟了汽车的行驶过程,边上的权值为全速通过所消耗的时间,而起步(从起点出发的边)、刹车(到终点结束的边)、减速(即将拐弯的边)、加速(刚完成拐弯的边)这四种不能达到全速的情况,消耗的时间为权值*2。问从起点到终点所消耗的最少时间。这道题主要是建图,很复杂,无耻地照着书上的代码码了一遍。让状态搞糊涂了= =注意:1、grid[][][4]记录了点的上下左右四条边的权值,id[][][4][2]记录各个点。2、到一个点的最短路可以是路过这个点再折返回来,e.g:1->2 c=17,2->3 c=4,从1->2的最短路为17+8+8=33 2 #include 3 #incl 阅读全文
posted @ 2013-08-23 21:02 Thousand Sunny 阅读(442) 评论(0) 推荐(0)
摘要:做的第一道差分约束的题目,思考了一天,终于把差分约束弄懂了O(∩_∩)O哈哈~题意(略坑):三元组{ai,bi,ci},表示区间[ai,bi]上至少要有ci个数字相同,其实就是说,在区间[0,50000]上,每一个三元组表示[ai,bi]之间至少要标记ci个数字,问至少要标记多少个数字。在学习差分约束的童鞋,建议看一下:09年姜碧野的《SPFA算法的优化及应用》,06年冯威的《浅析差分约束系统》,不过后者看起来较难搞懂,也可以看http://ycool.com/post/m2uybbf写的很不错。这里写一下我自己的一点心得:1、差分约束求的是什么? 这里分为两种:求值,判环。 求值:如这道.. 阅读全文
posted @ 2013-08-23 13:07 Thousand Sunny 阅读(433) 评论(0) 推荐(0)
摘要:一、核心性质:三角不等式。最短路满足d[v]maxlongint。借此提出:当dis[]>N*MaxEdge,可以判正环。(类比于入队n次) 2、环构成了连通分量,那么缩点后去掉连通分量之间的边,不影响判正(负)环。 3、牺牲程序正确性来判正(负)环。已知SPFA的平均运行时间为O(KM);而在存在环时,会因不断迭代使程序效率低下。借此提出:当程序效率低下时,存在正(负)环。表现形式为所有点入队总次数>T*(M+N),就判定存在,T一般取2,具体根据题目时限修改。分析:事实上,正是因为bfs迭代的不连续性,导致不能直接找到正环,退而求次,以n次入队判定。而n次入队其实包含了大量的冗 阅读全文
posted @ 2013-08-20 20:26 Thousand Sunny 阅读(1862) 评论(1) 推荐(0)
摘要:花了一天半的时间,才把这道题ac= =确实是道好题,好久没敲这么长的code了,尤其是最后的判定,各种销魂啊~题目中给出的条件最值得关注的就是:每个点最多只能在一个环内->原图是由一个个边连通分量以树形连接组成的->做无向图缩点后,得到的是一个树形结构。题目要求:u->v,必须经过p,且不能重复经过同一个点,即在树上从u到v做一笔画。开始先想到汉密尔顿迹,不过那是走全部点的。利用已获得的树形结构,通过lca来判断p,这就是一个合理的作法。注意:由于是任意建树,p不一定是u,v的lca,纠结了好久才想出了一个方法:x=lca(u,v),然后遍历v->x,u->x两条 阅读全文
posted @ 2013-08-16 18:50 Thousand Sunny 阅读(472) 评论(0) 推荐(0)
摘要:献上博文一篇http://hi.baidu.com/byplane747/item/53ca46c159e654bc0d0a7b8d设维度为k,维护(1 2 #include 3 #include 4 #include 5 #define rep(i,a,b) for(int i=a;iq[1<<5];21 int vis[MAXN];22 int a[5],b[1<<5];23 24 int main()25 {26 int n,cnt;27 while(~scanf("%d%d",&n,&cnt))28 {29 int op,s= 阅读全文
posted @ 2013-08-13 21:30 Thousand Sunny 阅读(366) 评论(0) 推荐(0)
摘要:坑了我一天的题目。。跑了20ms挂了,就知道有个小毛病= =无向图转有向图判强连通。首先要知道什么样的无向图可以转化为强连通图?连通分量(环)自然是可以的;那么扩大范围(存在割顶),发现点连通分量也是可以的;再扩大范围(存在桥),明显不能满足。所以边连通分量是实现无向图与强连通图转化的界限。那么如果原图本身不是边连通的呢?先缩点,问题转化为——怎样把无向无环图(森林)构建成边连通图:从度入手。其实真正要考虑的是叶子节点(degree==1),和部分根节点(degree==0或degree==1)。degree==0,需要加两条边;degree==1,一条;degree>=2,不需考虑。注 阅读全文
posted @ 2013-08-11 10:38 Thousand Sunny 阅读(265) 评论(0) 推荐(0)