摘要:虽然网上已经有很详细的解释了,但是别人总结的终究是别人的。1无源无汇上下界的可行流首先明确定义:B[u, v]和C[u, v]表示边(u,v)的下界容量和上界容量,我们的问题是求一个每条边都具有上下界的可行流。简单分析:由于每条边要满足下界容量,而且每个点要满足流量平衡,所以就需要对平时的网络流模型...
阅读全文
摘要:要求给定的图的中平均权值最小的环,注意处理自环的情况就能过了。按照w1+w2+w3+….wn #include #include #include #include #include #include #include #include #include #include #include #include #define esp 1e-6#define pi acos(-1.0)#define pb push_back#define lson l, m, rt VI;typedef pair pii;typedef vector VII;typedef vector VIII;typ...
阅读全文
摘要:题目大意是:对于(n, m)的图,给定边a, b查询从a到b要经过的割点的最少数目。先tarjan算法求双连通然后缩点,即对于每个割点将周围的每个双连通看成一个点与之相连。然后求解LCA即可,距离dis[u]表示从根出发到u的遍历过程中经过的割顶的数目,利用tarjan离线算法, 最后答案是:dis[u] + dis[v] - 2*dis[findset(v)] + (findset(v) > bcc_cnt)。注意findset(v) > bcc_cnt表示当LCA(u,v) 为割顶时的判断,此时必须加1。代码: 1 #include 2 #include 3 #include
阅读全文
摘要:题目要对每次询问将一个树形图的三个点连接,输出最短距离。利用tarjan离线算法,算出每次询问的任意两个点的最短公共祖先,并在dfs过程中求出离根的距离。把每次询问的三个点两两求出最短距离,这样最终结果就是3个值一半。其实开始我用的一种很挫的方法才AC的,具体思路就不说了,感觉很麻烦又不好写的样子。怎么没想到上面的简便方法呢。初始代码: 1 #include 2 #include 3 #include 4 #include 5 #include 6 #include 7 #include 8 #include 9 #include 10 #include ...
阅读全文
摘要:题目要求割顶集,并且还要求出去掉割顶之后剩下的图连通数目。tarjan算法求出割顶后直接枚举就可以了吧。一开始想到利用iscut[u]的次数也就是点u被判定为割顶的次数求连通分量数,还有利用与结点u相连的点的bccno不同的编号来判定,都是不行的,具体原因自己想清楚比较好。以后就不会犯这样的错误了。代码:#include #include #include #include #include #include #include #include #include #include #include #include #include #define esp 1e-6#define pi aco
阅读全文
摘要:给定一个无向的连通图,要求每个点去掉后连通分量的数目,然后输出连通分量最多的m个点。 分析: 先求出双连通分量,然后统计所有双连通分量中割顶出现的次数,最后求出的就是割顶去掉后剩下的双连通的数目,对于不是割顶的点,去掉后剩下的仍为双连通,所以结果就是1. 代码: #include #include #include #include #include #include #inc...
阅读全文
摘要:给n对夫妇安排座位,其中0h,0w分别表示新郎,新娘。同一对新郎,新娘不能坐在同一侧,而且互为通奸关系的人不能同时坐在新娘对面。 这道题目真是掉尽节操啊,,,欧美的氛围还是比较开放的。 分析: 首先说一下应该注意的是新郎新娘也可能是会有通奸关系出现的,所以一开始必须将他们考虑进去。 为每对夫妇设立一个变量,xi,1表示妻子和新娘坐在同侧,否则表示丈夫和新郎坐在同侧。然后用mark[2*i]...
阅读全文
摘要:每架飞机有早晚起降两种方式,给定n架飞机两种方式的起落时间,为每架飞机安排起落时间(早或晚),使得所有飞机起降时间按照早到晚的顺序之间的间隔时间最小值尽量大。 分析: 最小时间尽量大应该采用二分的方法比较好,然后就变成了判别某个时间间隔m是不是符合要求的了。为没加飞机设立一个变量xi,0表示早,1表示晚,然后每架飞机i用两个点2*i,2*i+1表示,前者如果被标记表示早,后者被标记表示晚降。 ...
阅读全文
摘要:给定一个图,求一个节点数目最多的团,对于其中任意两个节点u,v至少存在一条这样的路径使得u到v,或者v到u。分析: 先求出强连通分量,然后缩点,构成一个scc图,然后求一条最长的路,每个节点的权重即为该强连通分量的节点数目,由于是DAG, 所以可以用dp或者spfa,一开始用记忆化搜索竟然TLE,想也想不通,后来改成spfa,以0为起点,然后求出距离0的最大距离。spfa: 1 #include 2 #include 3 #include 4 #include 5 #include 6 #include 7 #include 8 #include 9 #inc...
阅读全文
摘要:给定n个命题之间的已经证明的关系如 a b表示已经证明蕴含式a→b,要求还需要再作多少次证明使得所有的命题都是等价的.将每个命题看成一个点,已经证明的命题之间连一条边,问题转化为添加多少条单向边使得图成为一个强连通分量. 先求出所有的强连通分量,然后缩点构成一个SCC图,统计其中入度为0的点个数a,以及出度为0的点的个数b,max(a,b)就是需要再作的证明.注意当图一开始就是强连通时,不需要作...
阅读全文
摘要:刘汝佳白书上面的一道题目:题意是给定一个联通分量,求出割顶以及双连通分量的个数,并且要求出安放安全井的种类数,也就是每个双连通分量中结点数(除开 割顶)个数相乘,对于有2个及以上割顶的双连通分量可以不用安放安全井。如果整个图就是一个双连通分量,那么需要安放两个安全井,种类数是n*(n-1)/2.代码来自刘汝佳白书: 1 #include 2 #include 3 #include 4 #include 5 #include 6 #include 7 #include 8 #include 9 #include 10 #include 11 #include...
阅读全文
摘要:题意描述:给定前n个字母的关系描述,根据输入的m组描述(类似A#include #include #include #include #include #include #include #include #include #include #include #define esp 1e-6#define pb push_back#define mp(a, b) make_pair((a), (b))#define in freopen("in.txt", "r", stdin);#define out freopen("out.txt&quo
阅读全文
摘要:给定一个字符矩阵,s[i][j]为+,-,0分别表示ai+……….aj的和为正,负,0。可以将连续和转化为前缀差,即s[i][j]为+可以表示为B[j]-B[i-1]为正,B[i]表示前i项的和,B[0]为0,然后拓扑排序找出相对关系再依次取值即可。注意相同的B[i],B[j]要注意保存,最后两者的值统一。最终输出结果a[i] = B[i]-B[i-1]l.代码:#include #include #include #include #include #include #include #include #include #include #include #include #define e
阅读全文
摘要:从刘汝佳训练指南上看到的一道题,看了解释之后发现是一道最短路问题,(x,y,d,c)表示位于(x,y)点面向为d,颜色为c的状态,然后每个状态有左转,右转,前进3个转移方式也就对应三条边,然后建图求最短路就可以了。代码: 1 #include 2 #include 3 #include 4 #include 5 #include 6 #include 7 #include 8 #include 9 #include 10 #include 11 #include 12 #include 13 #define esp 1e-6 14 #define pb...
阅读全文
摘要:这个题目巧妙之处在于用二进制的每个位1,0分别表示bug的有无,以及实施补丁对相应bug的要求以及实施后的对bug的影响。软件bug的状态:1表示相应bug仍然存在,0表示已经修复。这样可以将软件的状态用一个整数表示,例如1100(12)表示第1,2个bug存在,后面两个已经修复。那么,对于n个bug 的软件,起点src = (1 2 #include 3 #include 4 #include 5 #include 6 #include 7 #include 8 #include 9 #include 10 #define esp 1e-611 #define pb push_...
阅读全文
摘要:题目大意:共有n个人,m对人为已知的朋友关系,而且这种关系具有传递性,也就是A与B,B与C是朋友,可以确定A与C是朋友,求一个人数最多的朋友团体。bfs就可以了,遇到未访问的结点,加入队列并且朋人数增加,bfs一开始只访问未访问的结点,并作为一个团体的开始。、代码: 1 #include 2 #include 3 #include 4 #include 5 #include 6 #include 7 #include 8 #include 9 #include 10 #define esp 1e-611 #define pb push_back12 #define in fr...
阅读全文
摘要:题目大意:在一个网格地图中有一些高度不同的石柱,一些石柱上站着一些蜥蜴,你的任务是让尽量多的蜥蜴逃到边界外。 每行每列中相邻石柱的距离为1,蜥蜴的跳跃距离是d,即蜥蜴可以跳到平面距离不超过d的任何一个石柱上。石柱都不稳定,每次当蜥蜴跳跃时,所离开的石柱高 度减1(如果仍然落在地图内部,则到达的石柱高度不变),如果该石柱原来高度为1,则蜥蜴离开后消失。以后其他蜥蜴不能落脚。任何时刻不能有两只蜥蜴在同 一个石柱上。这个应该还算是比较难的网络流的题目了吧, 至少对我这个刚刚接触新手的人来说只这样的,AC的过程是痛苦而又备受煎熬的,最后一步步调试下来成功提交的那刹那,感觉全身满满的正能量,闲话少扯了.
阅读全文
摘要:题目大意:给定n条单向边,求图中任意两点的连通路径的数目。其中点是从0-输入中出现的最大的点。可以用floyd-warshall算法或者dfs.for(int k = 0; k j的通路。 1 #include 2 #include 3 #include 4 #include 5 #define N 30 6 using namespace std; 7 int n, m, dp[N][N]; 8 9 void floyd(void)10 {11 for(int k = 0; k Path保存经过的点,并在dfs搜索下一个点之后再已经走过的Path里面查找看是否存在相应点,如...
阅读全文
摘要:差分约束系统的第一个题目,看了落花大神的博客后,对差分约束有了一定了解,关键在于建图,然后就是判断是否存在负权回路。关于差分约束系统的解释详见维基百科:http://zh.wikipedia.org/wiki/%E5%B7%AE%E5%88%86%E7%BA%A6%E6%9D%9F%E7%B3%BB%E7%BB%9F利用spfa判断时,当图中有顶点出队次数多于图中顶点数目时说明存在负环。其实我自己敲上去的时候改了一点点。大神的time[g[x][i].v]当达到n+1时就返回false,这是不对的,因为点包括0嘛,所以最终应该有n+1个点,判断就应该改为达到n+2,而且这一点也从uva上得到证
阅读全文
摘要:要问是否存在一个总权重为负数的环,用dfs即可解决。time:33ms 1 #include 2 #include 3 #define N 3000 4 using namespace std; 5 int n, m, T, w[N], u[N], v[N], next[N], first[N], pa[N], d[N], tag, i; 6 7 void read_graph(void) 8 { 9 for(int e = 0; e d[x] + w[i],也就是能够继续松弛下去说明图中存在负权回路。time:44ms速度还慢了一点,相比dfs 1 #include 2 #i...
阅读全文