随笔分类 - Uva
摘要:最短路裸题啊,顶点数较多开不了邻接矩阵的,而且边数相对较少,稀疏图,用邻接表,写了个spfa和一个优先队列的dij,当做练手spfa#include <cstdio>#include <cstring>#include <queue>using namespace std;#define N 20010#define M 50010*2#define INF 0x3f3f3f3fstruct edge{ int u,v,w,next; }e[M];int first[N],d[N],vis[N];int n,m,s,t;void spfa(){ queue
阅读全文
摘要:题意:固定起点1和终点n,从1到n,再从n回到1,去和回的路上相同的边只能用一次,求两次的和最短,如果去的时候不能去到终点或者回的时候回不到起点那么就输出Back to jail,否则输出两次和的最小值(此图是无向图,不会有重边,边的权值在大于1小于1000)两种理解一种思路是最小费用最大流另一种是最短路不唯一且两条或者多条最短路由共用边 ,或者最短路与次短路有共用边我先写的是第二种思路,最小费用最大流还没写,明天补上,并且补上思路第二种做法是,把无向图当做有向图处理,拆成两条边,先从1到n做一次最短路,并且要记录这条有向路径。最短路结束后,记录下最短路的值d[t],如果为d[t]=INF(t
阅读全文
摘要:DP(仿照Floyd)uva 10048 Audiophobia 一样的题目啊这次是要找s到t的所有路径中,最小边的最大值,还是仿照Floyd,不过状态转移方程改一下,而且建图初始化也改一下就可以了(题目说了每条边的权都大于1)建图邻接矩阵初始化为,d[i][j]=g[i][j],不存在的边用0表示状态转移方程d[i][j]=min( d[i][j] , max(d[i][k] , d[k][j]) );题目有一个很隐晦的地方就是,每次送旅客过去,导游也是要过去的(然后他自己再回来),所以没一趟导游都占了一个位置,如果大家觉得sample不对的话,那就是一个小问题了#include <c
阅读全文
摘要:DP(仿照Floyd)题意:一个无向图,然后多个查询,查询是起点和终点s和t,s到t可能有多条路径,那么每条路径都会有一条权值最大的边,在所有的最大边中找一个最小的,如果s到t之间不连通,那么输出no path想了很久,大概有两个小时的样子…………然后看了一下数据,刚好最多有100个点,最多10000个查询,那么就给了一个很大的启发,会不会有一个算法会好像dij一样,运行一次能得到做个答案,或者一个算法好像floyd一样,运行一次可以知道所有答案,出于数据的特殊性,我更倾向于往floyd的方向想。floyd的本质是DP,其实这个问题也很容易发现就是个DP,状态转移方程为max=MAX{ d[i
阅读全文
摘要:最小生成树和这道题是一样的,不过就是给出的数据不同hdu 1879 继续畅通工程说来惭愧,写hdu那个的时候是1Y的,但是写这个却WA了一次是因为整个做法想错了WA的想法是先用邻接矩阵建图,然后用一个had数组记录已经存在的边,在计算MST最小权值的时候如果是已有的边就不用算费用,所以需要adj数组去记录 边的信息但是这个方法显然是错的,因为MST不是唯一的,如果最后MST的总权值最小,但是可能不同的MST用到的已有的边的条数是不同,用到的已有的边最少,那么需要额外付的费用就越好,如果是上面那样做,显然是WA正确的做法就是把已有的边的权值赋值为0或者一个负数都可以(最好是0,那么就不用判断是否
阅读全文
摘要:最小生成树#include <cstdio>#include <cstring>#include <cmath>#define INF 1000000000.0#define N 110double g[N][N],lowcost[N],x[N],y[N];int n,cov[N];double dis(int i , int j){ return sqrt((x[i]-x[j])*(x[i]-x[j])+(y[i]-y[j])*(y[i]-y[j])); }int main(){ int T; scanf("%d",&T); w
阅读全文
摘要:最短路题意:有一栋楼100层,从0到99编号层数,有多部电梯(最多5部),给出每部每部电梯的速度,即上或下一层楼所用的秒数。然后每部电梯不一定在所有楼层出现,给你所有电梯可能出现的层数。给你一个目标层,要你从0层开始到目标层,问所用时间最短。在0层的时候选择做哪步电梯出发不需要时间的,但是在中间的楼层,想换电梯的时候,需要60秒这个题目看完就可以想到是最短路,每层楼是1个顶点,一共100个点,然后对于楼层而言可以通过电梯到达的话就是有一条边,权值就是时间,那么可能出现平行边,比如1号电梯可以从10楼到20楼,用时200秒,2号电梯也可以从10到20楼用时100秒……………………这题,一开始没想
阅读全文
摘要:最大流水题题意:给n个点从1到n标号,每个点有一个限制值a[i],表示从这个点流出的流量的最大值,就算有超过a[i]的流量流进i点,最后也只有a[i]流量从i点流出。然后每条有向边也有容量cap[u][v]然后给你一个源点0,它会和一些顶点相连,这些边的容量是无穷大的,然后给你一个汇点n+1,也会和一些顶点相连,这些边的容量也是无穷大的,然后求源点到汇点的最大流想了一下,有思路,无非是处理一下边的容量,起初想是对于有向边 u---->v cap[u][v]=min( cap[u][v] , a[u]); 处理完就直接最大流模板上去,过了sample,提交WA,后来才想到是cap[u][v
阅读全文
摘要:这个题目,做之前不知道什么事差束约分,看完题目上床睡觉,想了半个小时,想到了要判断一个有向图有没有负环。第二天起来再想,觉得是判断有没有环(包括负环,正环,0环),但是不确定,要真的是这样的话,要权值来干什么,直接拓扑排序就好了,然后不确定,找了解题报告瞄一下,个个都是差束约分,然后没看其他内容,直接去学差束约分,看算法导论和网上的资料看了一个小时,懂了,就写,其实就是差束约分的模板题说说思路和题目:给你一个长度为n的序列,从下标1到n标号,然后给你m个连续的子序列,让你求和,和要大于或者小于给定的k,如果这m个不等式都能成立,就输出成功,只要有一个不成立就输出不成立。sample中第一个就是
阅读全文
摘要:最小费用最大流:无向图(所以必须用邻接表)+当流量为D时的最小费用(即限制流量在D,求最大流)题意:就是给你一个无向图,给出所有的无向边和它们的单位费用(题中说了不会有平行边),然后给出D,K,K是指每条无向边的容量固定为K,然后问当流量为D时最小费用是多少,如果流量无法得到D这个数值,那么就输出Impossible. 解决这个问题的方法就是限制流量,加一个新的源点(或者汇点,道理一样),增加一条有向边,就是新的源点指向原本的源点,这条有向边的容量就是D,费用是0,然后求新源点到汇点的最小费用最大流,可以知道,求出来的最大流一定是小于等于D的(同样是最大水流取决于最细水管的道理,水流必须从新的
阅读全文
摘要:题意:就6种型号的衣服,然后给你n件衣服,n一定是6的倍数,也就是每种类型的衣服的件数是一样的,然后给m个人,每个人能穿两种型号的衣服,给你每个人穿衣的信息,然后判断是否每个人都能找到衣服穿很显然是二分图最大匹配,但是这里有个小问题,就是一种衣服有多件,可能被多个人穿,和二分图匹配有点不同,在最大匹配中每个点是只会出现一次的,这个问题要解决不难就是把相同的衣服拆成多件不同的衣服处理,但是建图的时候就要注意多处理一下,建图完毕后就是纯粹的匈牙利算法//问题一看就是二分图匹配,不过一个种衣服会有多件要怎么处理呢,就把多件相同类型的衣服当做不同衣服来处理//衣服按照1到6编号,如果第i种衣服有重复的
阅读全文
摘要:题意:给你n个城市的坐标,任意两个城市都是有通路的(无向的)要你算出所有点之间最短路(显然就是Floyd),然后要满足一个条件,任意两点的直接连线不能大于10,所以我们在建图的时候要算出任意两点的直接相连距离,如果有的大于10,我们将它变为INF,相当于这两点间是没有通路的。做完这个处理后就是直接的Floyd输出的意思是,要保证任意两点间都是连通的(也就是任意两点的最短路都不是INF,因为没有通路的话最后最短路会为INF),如果不能满足的话就输出失败如果能满足,也就是所有两点间的最短路都知道,那么找到最大的那个,输出,保留四位小数水题啊水题啊水题啊!!!!!!…………………………题目给的那个公
阅读全文
摘要:算是模板题,给定一个有向图,顶点从0到n-1编号,必须从0开始出发,问是否存在负环一开始写了一个Bellman-Ford,超时,然后就放弃了,写了个spfa的bfs版本,过了,然后又写了一个spfa的dfs版本,wa,然后改了一个下午,还是wa然后上网找了一下代码,发现很多人写的都是BF算法,看了一下自己的一样,怎么会超时呢??后来才发现,我读错题意了,我本来是理解为只要图中有负环就好了,所有枚举了所有的顶点作为源点去BF,所以才超时,现在是规定了0作为源点,所以就AC了然后就把spfa的dfs版本改了一下,不要枚举所有源点,规定0为源点,然后就AC了,再修改了一些细节地方,跑出了最好成绩0.
阅读全文
摘要:纯粹考察并查集,算是一个经典问题;统计一个集合中有多少个元素,然后找到元素个数最多的集合就普通的并查集,就能过了然后另外写了压缩路径,没想到时间没有改变然后再写一个,时间还是没有改变,好吧……………………只要懂基本的并查集的话,代码都不成问题,很裸的并查集而已代码一:纯粹#include <cstdio>#include <cstring>#define N 30000int p[N],c[N];int n,m;int find(int x){ return p[x]==x ? x : p[x]=find(p[x]); }int main(){ int T; scanf
阅读全文
摘要:最大流裸题,有向图,然后又重边,容量要累加,这里是用BFS来做的#include <cstdio>#include <cstring>#include <queue>using namespace std;#define INF 0x3f3f3f3f#define N 20queue<int>q;int f[N][N],c[N][N],a[N],p[N],flow;int n,m;//源点和汇点分别规定为1,nvoid BFS(){ flow=0; while(1) { memset(a,0,sizeof(a)); a[1]=INF; ...
阅读全文
摘要:最大流裸题,不过要注意建图,有重边,容量要累加,然后是无向图,就当做是有两条方向相反的有向边处理即可,详细看读取数据建图部分然后就是按照白书上面的最大流模板(BFS)来做#include <cstdio>#include <cstring>#include <queue>using namespace std;#define INF 0x3f3f3f3f#define N 110int f[N][N],c[N][N],a[N],p[N];//a数组是一个递推数组,p相当于记录路径int n,m,s,t,flow;queue <int> q;voi
阅读全文
摘要:近期所做题目中最好的一道,首先是比较创新不是常规的,另外需要比较好的数学功底能够洞察到一些小细节,然后转化方法貌似有很多,我自己想了很多但是都很差劲,最后实在没办法很无耻地找了解题报告,这篇解题报告感觉写得最好,我就是按照他的思路自己写的代码1A,佩服佩服此大神解题报告 http://hi.baidu.com/lixubd/item/1fbebd2c0389700f43634a5f算法思路都在里面了,我就不写了,我自己独立写了代码,加了很多注释,代码虽然比较多(这道题代码本来就多),然后其实不难读懂说明一点,预处理后的矩阵行和列都翻倍了,我的代码行和列都是从1开始标号的,而那位大神的代码都是从
阅读全文
摘要:在poj上也有 是poj 1420,在poj上AC了,但是在UVA上RE题意:很好理解就是给你一个表格,一些元素已经有数字了,一些元素还不知道,但是它等于某些元素相加的和,要你补完整个表格(行用1到999表示,列用大写字母来表示,用ABC开始一直到ZZZ,这个很容易算出来,26+26*26+26*26*26=18278,字符处理有些麻烦,代码中的funtion函数)这个东西一开始没想到是什么,后来喵了一下解题报告说是拓扑排序,瞬间就懂了,因为有些元素是未知的,未知的元素是由已知的元素相加得到的,那么就是有一个优先关系,看sample就看得出来然后数据较大,打了一半不知道要怎么做了,然后又轻轻喵
阅读全文
摘要:献上题意:个你一个转轮,有5种颜色,为了5中颜色的位置是确定的,为了方便处理我们用01234来表示绿,黑,红,蓝,白。轮子可以沿着它的方向滚动(只能是它当前的方向不能相反方向),每滚动一次会到达另一个格子,着地的颜色会改变,变了之前颜色的下一个,例如当前是绿色着地下一次就是黑色,依次是红蓝白。也可以原地转动(顺逆时针都可以),原地转动其实就是改变了轮子的滚动方向,原地转动每次能转90度。原地转动一次和滚动一次时间都是1秒。另外轮子有4个方向,上北下南左西又东。另外给你n*m个格子,有些格子不能到达,用#表示,给你起点S和终点T。在起点时轮子方向规定向北,绿色着地,然后滚动到终点,要求绿色着地,
阅读全文
摘要:说白了还是搜索题输入n有n个点,从1到n标号,起点为1,终点为n,下面n行是每个点信息第一个数字是该点所带的能量值,第二个数字是该点的出度m,然后m个数分别是和该店相连的点的标号起点和终点的能量值都是0游戏一开始的能量值是100,没到达一个点,新的能量值等于之前的能量值加上该点的能量值,游戏要求在任何一个的时候能量值都不能小于等于0,问最后能否到达终点另外一个点是可以多次到达的这题不要想复杂了其实很好做当发现有个和为正值的环存在时,直接求看该点能否直接到达终点。如果可以,直接返回true,即winnable。否则,不用做任何的标记。因为不会再去探索它是否可以直接到达终点。在搜索的过程中看看有没
阅读全文