做题小技巧:
- 无向图连通性 考虑 并查集
- 有向图依赖性 考虑 深度广度优先 拓扑排序
并查集(684、839\547、684、685)
public class DSU {
private int count;
private int[]parent;
public DSU(int n){
this.count=n;
parent=new int[n];
for (int i = 0; i <n ; i++) {
parent[i]=i;
}
}
public void union(int p,int q){
int rootP=find(p);
int rootQ=find(q);
if(rootP==rootQ){
return;
}
parent[rootP]=rootQ;
count--;
}
private int find(int x){
while (parent[x]!=x){
x=parent[x];
}
return x;
}
public boolean connected(int p,int q){
int rootP=find(p);
int rootQ=find(q);
return rootP==rootQ;
}
public int count(){
return count;
}
}
拓扑排序(判断是否是 有向无环图(DAG))399、207、210
//入度表
int[] indegrees=new int[n]
List<List<Integer>> adjacency=new ArrayList<>()
for(int i=0
adjacency.add(new ArrayList<>())
}
//构建领接表
for(int[] cp:prerequisites){
indegrees[cp[0]]++
adjacency.get(cp[1]).add(cp[0])
}
//记录入度为0的点
LinkedList<Integer> queue=new LinkedList<>()
for(int i=0
//BFS
while(!queue.isEmpty()){
int pre=queue.poll()
n--
for(int cur:adjacency.get(pre)){
if(--indegrees[cur]==0) queue.add(cur)
}
}
return n==0