ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

国王的烦恼 蓝桥算法真题 并查集 java实现

2022-03-18 23:32:47  阅读:174  来源: 互联网

标签:Bridge java 真题 int 查集 蓝桥 static new return


package qs;

/*
 * 
 * 测试数据为:
4 4
1 2 2
1 3 2
2 3 1
3 4 3
 * 
 * 
 * 
 */

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.Scanner;

public class testunionfind {
   
	static int s[];
   
  // static Bridge[] b=new Bridge[1000000+1];  这个数组排序无力,去掉,数据结构选择有问题
  static ArrayList<Bridge> blist=new ArrayList<Bridge>();
   
	public static void main(String[] args) {
		// TODO Auto-generated method stub
       Scanner sc=new Scanner(System.in);
       int n=sc.nextInt();//小岛的个数
       int m=sc.nextInt(); //桥的数目
       s=new int[n+1];//下标0没有使用
       for(int i=1;i<=m;i++)    //读取m个桥的信息
       {
    	  Bridge bdg=new Bridge();
    	   bdg.a=sc.nextInt();
    	   bdg.b=sc.nextInt();
    	   bdg.t=sc.nextInt();
    	   blist.add(bdg);
       }	
       System.out.println(blist);//这一条是测试语句
       
        sort(blist);   //按天数排序   blist传给参数blist2后,不知道能不能实现排序的目的??
       //传参行不行???????
//       Collections.sort(blist,new Comparator<Bridge>(){
//			//override
//			public int compare(Bridge o1,Bridge o2){
//				return o2.t-o1.t;
//			}
//		});
       System.out.println(blist);
       init(n);   //先把小岛孤立的初始化为分散的并查集
       
       int a=-1;  //a用来判断前后抗议的天数是不是在同一天
       int sum=0; //sum用来表示抗议的天数
       for(int i=0;i<m;i++)  //倒叙得到m个桥,jingxing合并。合并时并查集-1,则抗议+1
       {   //得到第i个桥梁,它可以把两个小岛合并
    	  int b= mergee(blist.get(i).a,blist.get(i).b);    //把桥两端的岛屿合并
    	   
    	 if(b==1)//如果不属于一个集合而合并成功为一个集合
    	 {
    		 if(blist.get(i).t!=a)//与上一个抗议的日期不在同一天
    		 {sum++;
    		 a=blist.get(i).t;
    		 }
    	 }
       }
       
       System.out.println("sum="+sum);
       
	}

	
	
	//把桥按照天数逆序排序,逆向思维进行建立桥梁  每当建立一个桥梁,集合减少,说明没有这所桥梁时,
	//有两个孤立的集合存在,那么老百姓无法过桥到另外一座岛屿上,则老百姓在抱怨
	// 传参可
	private static void sort(ArrayList<Bridge> blist2) {
		Collections.sort(blist2,new Comparator<Bridge>(){
			//override
			public int compare(Bridge o1,Bridge o2){
				return o2.t-o1.t;
			}
		});
	}
	
	//




	private static int mergee(int x,int y) {   //并查集把有关系的和并在一起
		// TODO Auto-generated method stub
		x=findx(x);
		System.out.println(x);
		y=findx(y);
		System.out.println(y);
		if(x!=y)
			{s[x]=y;
			return 1;//return 1说明本来是不连通的(不在一个集合中的)
			}
		else 
			return 0;//return 0说明本来是在一个集合中的
	}

	
	private static int findx(int x)   //并查集查询并优化
	{  if(x!=s[x])
		  s[x]=findx(s[x]); //查询并优化
	   return s[x];
	}

	public static void init(int n)  //并查集初始化
	{
		for(int i=1;i<=n;i++)
		{s[i]=i;       //s[]是并查集的基本数据结构
	System.out.println("s[i]"+s[i]);
		}
			
	}
	
	
	
}




class Bridge{
	//Bridge是个对象   a,b, 是桥连接的小岛的号。t是 天数
	 public int a,b,t;
	public Bridge(){
		
	}
	public Bridge(int a,int b,int t)
	{this.a=a;
	this.b=b;
	this.t=t;}
	
	public String toString()
	{return a+" "+b+" "+t;}
	
}

标签:Bridge,java,真题,int,查集,蓝桥,static,new,return
来源: https://blog.csdn.net/julyyy123/article/details/123586911

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有