A:二分查找
二分模板题,就不多说了
B:jump and jump
这题可以用dp推一下或者用bfs去跑,注意步长0的就点就好了
C:八皇后问题
dfs入门题,不多说了
D:畅通工程
并查集入门题,把每一个城市当作点,然后输入的时候连通两个点,如果已经连了那就不必再连,最后剩下k个点,那么如果全部连起来只要k-1条边就好了
E:城市路
最短路径模板题
F:确定比赛名次
拓扑排序,有bfs和dfs写法,讲下bfs写法。
假设a要在b之前,那么把b点的入度+1,同时把b放到a维护的集合中
for(int i = 0;i<m;i++){
int a = in.nextInt();
int b = in.nextInt();
ru[b]++;
edge.get(a).add(b);
}
那么我们先去找入度0的点(也就是没有要求的点,先把放到队列中),然后通过BFS去跑下就好了,因为要求字典序从小到大,所以用下优先队列去存。
下面的是部分关键代码:
while(!queue.isEmpty()){
Integer first = queue.poll();
System.out.print(first);
List<Integer> list = edge.get(first);//拿到要在该点之后输出的集合
for(int i = 0;i<list.size();i++){
ru[list.get(i)]--;//把点的入度减去1
if(ru[list.get(i)]==0){//如果入度为0了 说明就是没有条件限制了,那么就是可以加入到队列中去了
queue.add(list.get(i));
}
}
}
G:营救天使
BFS简单搜索题,注意下杀死守卫会导致步数多增加了,所以用下优先队列去维护下。
H:学长的象棋加强版
BFS简单搜索题,注意好x和y即可。
I:欧拉回路
并查集题,注意下什么叫欧拉回路。
1.利用并查集来判断是否是连通图
2.一个无向图存在欧拉回路,当且仅当该图所有顶点度数都为偶数,且该图是连通图。
J:Arctic Network
最小生成树的板子题,没什么坑点,注意下点的个数即可
K:流感传染
bfs板子题,不多说了
L:过山车
二分图的板子题
M:Fire Net
dfs搜索题,和八皇后差不多。
N:Number Move
并查集题找环,一开始的时候模拟A的,后面发现并查集就好了,重新去做了一遍,注意好统一的方向,不用去维护父节点更新的问题,只要判断他们两个同一个父节点,就去递归找自己,肯定能找到,统计下中间的个数即可,做个优化判断已经是处于环中,那么下次再来直接不找了,因为肯定是找不到自己了,找几个案例画一下就知道了。就这么混A了
O:图着色问题
图的练习题,没什么太大坑点,判断连通边即可