算法模板二(广搜,并查集,带权最短路模板)

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;
    }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值