摘要:
大意略。思路:开始的每加一次边就用Tarjan求一次桥边,这样肯定超时了。后来发现,只要在x->y之间连一条边的话,那么在x->y以及到它们的LCA之间形成了一个环,那么之间割边都不存在了。求LCA的做法:把它们上升到同一个层次,然后一起往父亲节点走即可。#include <iostream>#include <cstdlib>#include <cstdio>#include <string>#include <cstring>#include <cmath>#include <vector>#i 阅读全文
摘要:
大意略。无向图求双连通块,冲突的边,即缩块之后如果点数>边数,说明无环,则该路径可以去掉。如果有环,则环中所有的边都冲突。#include <iostream>#include <cstdlib>#include <cstdio>#include <string>#include <cstring>#include <cmath>#include <vector>#include <queue>#include <algorithm>#include <map>usin 阅读全文
摘要:
大意:给定一张无向图,图可能不连通,让你求图中的桥,以及该桥两端连接的端点的全称,输出按输入顺序从小到大输出。思路:求出桥边,当前边的序号为奇数时,存储正向边,因为可能存在v->u的情况,于是把边反向u->v,然后排一次序输出即可。#include <iostream>#include <cstdlib>#include <cstdio>#include <string>#include <cstring>#include <cmath>#include <vector>#include <q 阅读全文
摘要:
大意:给定一个无向图,问是否存在一条边使得删去该边后,使得该边左、右的双联通分量的权值的差值尽量小。思路:求得双连通分量后,把原图缩成了一棵树,然后再树上做DP即可,求ans = min(ans, (sum-val*2)); 其中val为左右子树的权值。#include <iostream>#include <cstdlib>#include <cstdio>#include <string>#include <cstring>#include <cmath>#include <vector>#include 阅读全文
摘要:
大意:给定一个图(多汇点,一个流入点),问能改变哪些边的流量使得原网络的流增加。思路:求网络流里的关键边,关键边一是最小割集上的子集。它具有如下性质:1、满流;2、源点可以通过残余网络(残余量不为0)访问到该边的起始点u;3、汇点可以通过残余网络(残余量不为0)访问到该边的终点v;求出网络流后,2次dfs求出所有标记即可,如果该边满流且起点、终点都被标记,则说明该边是关键边。#include <iostream>#include <cstdlib>#include <cstdio>#include <string>#include <cst 阅读全文
摘要:
大意:Flymouse到达一个寝室时,可以选择进入寝室、发放礼物、倾听接收礼物或者默默的绕开这个寝室,可能会多次经过同一个寝室,但绝不会第二次进入该寝室。求:在发放礼物整个过程中,收获的最大安慰指数是多少。思路:首先将有向图缩点,缩点后,重构图每个点内的权值为该强连通分量的权值之和(负权值赋值为0,因为可以绕过去),然后在有向无环图上找最长路径,DP、SPFA均可。#include <iostream> #include <cstdlib> #include <cstring> #include <cstdio> #include <que 阅读全文
摘要:
大意:在一片海域海域(长、宽为100的正方形)中有一孤岛,孤岛是直径为15.0的圆形区域,在孤岛的周围有一些点,问你是否能够成功的跳出这片海域,最少的时间是多少以及步数是多少?思路:关键在于建图,图中的点分3类:1、孤岛到点。2、点到点。3、点到终点。注意,点到终点的距离是50分别减去X、Y坐标的最小值,孤岛到点的距离需要减去半径。还有如果可以一步跳出去,就一步跳出去。建完图后,bfs或者Dijkstra都行。View Code #include <iostream>#include <cstdlib>#include <cstdio>#include &l 阅读全文
摘要:
大意:给定一些灯泡,灯泡的照明范围是R,当两个圆相切或者相交时可以看做一个连通的,问最多可以去掉多少个灯泡使得剩下的3个圆还是连通的。思路:把圆看做顶点,判断圆是否相交,如果相交,赋边权为1,然后枚举一个定点到三个点的最小值,用总数减去最小值减1即是答案。View Code /*最短路;三点连通*/#include <iostream>#include <cstdlib>#include <cstdio>#include <string>#include <cstring>#include <cmath>#include 阅读全文
摘要:
大意:起始点100HP,给定n个房间,进入房间内加上或者减去 wHP,同一房间可以进入多次,问能否到达终点(HP大于0)。起点0,终点n-1。思路:假设图中没有环,如果要到达终点,则需让剩下的HP,如何让剩下的HP最大呢?求一遍最长路即可,然后判断d[n-1]是否大于0.如果图中有正环,则一定可以走出去。因为我们一直绕着正环走的话HP可以到达INF,如此,我们找到正环中的点,然后判断正环中的点是否能够到达终点即可(连通),可以用dfs或者Flyod。初始条件为:d[s] = 100(开始时HP为100,第一个房间和最后一个房间的HP为0)图终点入队的约束条件是:(!inq[e.to] & 阅读全文
摘要:
大意略。思路:预处理出终点到所有点的长度,然后用记忆化搜索去写,边界条件为d[t]=1,d[i]表示从i出发的路径条数。View Code #include <iostream>#include <cstdlib>#include <cstdio>#include <string>#include <cstring>#include <cmath>#include <vector>#include <queue>#include <stack>#include <algorithm 阅读全文