摘要:
最小生成树入门题题意:有n个点给出坐标,点和点之间可以用无线电或者卫星通信,每个点都有无线电收发器可进行无线电通信,但是只有m个点有卫星通信功能。卫星通信的距离可以无限大,但无线电通信的距离不能超过D,超过D的部分将使通信费用增加。要使通信费用最少。其实就是求一次最小生成树,m个点有卫星通信,那么就会有m-1条边的通信距离无限大,其实就是这m-1条边不用计算费用。而剩下的边中,找出最大边作为D值,这样剩下的所有的边都不会大于D,那么不会增加通信费用。在构建MST过程中保存下所有的边权值,然后按升序排序,除掉最后的m-1条边(也就是最大的m-1条边,这些边用卫星通信),最大的那条就是D#incl 阅读全文
摘要:
dp入门题(LCS最长公共子序列)先给出正确的序列,再给出多个学生写的序列,要求在正确和学生序列中找到LCS。但是要先转换即做一下映射原本的序列是以事件为标准给出的,即以序列中的a[i]表示事件i发生的时间为a[i]。要转化为以时间为标准的,转化后a[i]表示时间i发生的事件为a[i]然后以转化后的序列来求LCS/*先映射再用LIS模板求解*/#include <cstdio>#include <cstring>#define N 25int t[N]; //映射数组int a[N]; int n;int max(int a ,int b){ return a>b 阅读全文
摘要:
怎么个图论法??这题一读完题一直没有思路,不知道和图论有什么关系,倒是一开始就想到了暴力,但是见数据的规模,怕暴力会超时所以就没写一直歇了两天,没思路去找解题保报告,看了几下,都是暴力求解(和自己当初想的一样都是求lcm作为周期来计数),所以就写了一个暴力,一次成型没有debug过了sample直接丢上uva去,AC了,不过时间也比较糟糕1.100s左右。#include <cstdio>#include <cstring>#define N 1010#define M 15bool killed[N];int c[N];int a[N][M];int n;int ki 阅读全文
摘要:
DP,无耻地搜了解题报告……DP又卡住了,看了题目就觉得是DP,自己写了一个怎么过不过,另外解决不了环的问题,最后还是看了解题报告依然是仿照Floyd来DP。i到j经过k,那么i到j的路径数目等于i到k的路径数目乘以k到j的路径数目DP结束后扫描一遍所有的点,若d[k][k]不为0,说明从k出发能回到k(而题目说了输入不会存在自己到自己的环),那么从k点出发一定存在至少一条回路,d[k][k]=-1那么i到j,如果经过了点k,就有无数条路径(先从i到k,然后走回路回到k,再从k到j),把d[i][j]=-1#include <cstdio>#include <cstring& 阅读全文
摘要:
最短路(隐式图搜索)题目是过了,不过时间好慢,用了2.200s。大概是没有用位运算的原因,我是直接模拟的。而解决最短路的问题是用spfa来做(感觉这种思路更加形象和容易理解,并且更符合隐式图搜索的感觉)来说说题意,这个题意都是很长很烦的。首先给出n和m,表示有n个bug和m个补丁。一开始存在n个bug,用1表示一个bug存在0表示不存在,所以一开始就是n个1,我们的目的是要消除所有的bug,所以目标状态就是n个0。对于每个补丁,会给出使用这个补丁的时间,另外会给出两个长度为n的字符串,第一个字符串表示这个补丁适用于什么情况下的bug,第二个字符串表示使用完这个补丁后原来的bug会变成怎么样。先 阅读全文
摘要:
①判定某些位置是否为1,如判定2、4位置为1,则转化为判断x|0101是否等于x。②判定某些位置是否为0,如判定2、4位置为0,则转化为判断x&1010是否等于x。③将某些位置转化为1,如2、4位置转化为1,则令x=x|0101。④将某些位置转化为0,如2、4位置转化为0,则令x=x&1010。 阅读全文
摘要:
最小费用最大流题意:有n个地点,m部船(m>=n),给出每部船到每个地点的时间。然后要派船到地点。每个船只能用一次即只能去只能去一个地方,每个地方只需要一部船。算出最小平均时间。要算平均时间其实就是算总时间最小,然后除以n即可。那怎么求总时间最小呢?其实一看,就是匹配类型的问题,但是就我目前学的匹配的算法,没有可以解这道题的,然后是出于白书的图论专题,就考虑是不是可以转化为其他类型的问题来解呢?想起二分图最大匹配问题可以转化为最大流来解,所以很快就想到了用最小费用最大流来解船从1到m标号,地点从m+1到m+n标号。建立有向图,都是从u船指向v地点,单位费用就是u船到v地点的时间,容量就是 阅读全文
摘要:
并查集经典题目,详细写一下吧题意:虽然比较长,但是题意还是比较好懂的。如果a和b是朋友,b和c是朋友,那么a和c是朋友。如果a和b是敌人,c和b是敌人,那么a和c要成为朋友操作1和2是假设(或者说试图建立某种关系),如果能成立不用输出,并且保持这种关系,如果这种假设(关系)与之前已经存在的关系是冲突的,那么输出-1,并且要保持原来的关系,放弃当前这个失败的。操作3和4是判断,即根据当前已知的关系,判断某两个人之间的关系是否成立,成立输出1,不成立或者无法确定就输出01 a b 即试图让a和b成为朋友唯一不成立是:a在b的敌对集合中(那么同时b一定在a的敌对集合中)a和b有共同敌人,成立a和b至 阅读全文
摘要:
题意:有n个铁环用长度均为1的绳子连起来(不会有重边)。试图拿起两个铁环并在水平方向拉直,那么会有一些边会被拉直(可想而知有些绳子不会被拉直而是弯曲的),那么取哪两个铁环并拉直,能使被拉直的直线最多呢?输出最多的边数这题其实是最短路,而且通过这题可以帮助我们更形象地理解最短路的实质尤其理解松弛操作当两个点a,b被拉直,那么其实那些被拉直的边就是最短路径(从a出发到b,或者反过来也行,因为是无向图),也就是说,要找到所有的最短路径并统计有多少条不同的边(因为不同的最短路径可能共用相同的边),那么就是这两点的数目,我们只要枚举任意两个点被拉直时不同边的数目,并找到最大的那个就可以了。所以要先知道任 阅读全文
摘要:
最小费用最大流一般用邻接表来实现,因为邻接矩阵不能处理平行边等等;而一条有向边是要储存两条信息,无向图的话要拆成两条有向边处理,相当于变为4条边,这也是邻接矩阵不能做到的然后最小费用最大流的原理就不讲了,讲一下实现的要注意的问题和一些技巧1.用结构体数组来保存边,最好从下标0开始保存不要从下标1开始保存,因为增广的时候需要用到位运算,从下标1保存不利于位运算2.为了满足上面的位运算的要求,除了从下标0开始外,储存边的顺序也有讲究,以一条无向边做例子(u,v),cap,cost,flow=0; //一开始流量为0/****有向边u---->v****/add(i,u,v,cap,cost, 阅读全文