bfs
LinkedList<Integer[]> q = new LinkedList<>();
q.offer(new Integer[] { 2, 2 });
visit[2][2]=true;
int cnt = 0;
while (!q.isEmpty()) {
int size = q.size();
while (size-- > 0) {
Integer[] poll = q.poll();
int x = poll[0], y = poll[1];
if (结束条件) {
System.out.println(cnt);
return;
}
for (int i = 0; i < 4; ++i) {
int xx = x + dir[i][0], yy = y + dir[i][1];
if (xx-tmp >= 0 && x +tmp< n && yy-tmp>= 0 && yy+tmp < n && !visit[xx][yy] && check(xx, yy)) {
q.offer(new Integer[] { xx, yy });
visit[xx][yy] = true;
}
}
}
cnt++;
}
并查集
pre = new int[n+1];
for (int i = 1; i <=n; i++) pre[i] = i ;
int k = sc.nextInt();
while (k-->0) {
int a=sc.nextInt(),b=sc.nextInt();
int xx=find(a),yy=find(b);//找爹
if(xx!=yy) {//拼爹
pre[xx]=yy;
ans--;
}
}
private static int find(int x) {
if(pre[x]==x) return x;
return find(pre[x]);
}
}
带权最短路径(包括单源最短路dijistra,多元最短路Floyd)
//初始化
int lim=Integer.MAX_VALUE/2;
public int networkDelayTime(int[][] times, int n, int k) {
//n 几个点 k从谁开始 times连接情况和权重
int[][] g=new int[n+1][n+1];
for (int i = 1; i <=n; ++i) {
for (int j = 1; j <= n; j++) {
g[i][j] = g[j][i] = i == j ? 0 : lim;
}
}
for(int[] t:times){
int x=t[0],y=t[1];
g[x][y]=t[2];
}
return floyd(g,n,k);
}
public int floyd(int[][] g,int n,int start){
//第一步 图重载初始化
//第二步 floyd开始
for(int k=1;k<=n;k++){
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
g[i][j]=Math.min(g[i][j],g[i][k]+g[k][j]);
}
}
}
//第三步 找ans
int max=0;
for(int i=1;i<=n;i++){
max=Math.max(g[start][i],max);
}
return max==lim?-1:max;
}
public int dijistra(int[][] g,int n,int k){
//第一步初始化
int[] dis=new int[n+1];
boolean[] st=new boolean[n+1];
int lim=Integer.MAX_VALUE/2;
Arrays.fill(dis,lim);
//第二步图的重载
//第三步dijistra开始
dis[k]=0;
for(int i=1;i<=n;i++){
int tmp=-1;
for(int j=1;j<=n;j++){
if(!st[j]&&(tmp==-1||dis[tmp]>dis[j])) tmp=j;
}
st[tmp]=true;
for(int j=1;j<=n;j++){
dis[j]=Math.min(dis[j],dis[tmp]+g[tmp][j]);
}
}
//第四步找 ans
int ans=0;
for(int i=1;i<=n;i++){
ans=Math.max(ans,dis[i]);
}
if(ans==lim) return -1;
return ans;
}