bfs找最短路(Java实现)

实现的功能:

1、建一个100个点,3000条边的随机图,用邻接链表保存图的信息。(图是随机建成的)

2、给一个点,找出该点到其他点的最短路。

package text1;
import java.util.Random;
import java.util.Scanner;
/*实验一:随机生成3000条边,100个顶点的有向图,找出从一个点到其他点的路径
 * 
 * 用邻接链表来存图
 * 
 * 
 * */

//定义链表结构
class note{
	note next = null;
	int pot;
}

public class sf1 {
	//插边
	static void insert(note n,int p){//n是起点  p是终点
		note t = n;
		boolean b = true;
		while(t.next!=null){//去重
			t = t.next;
			if(t.pot == p){
				b = false;
				break;
			}
		}
		if(b == true){
			note newt = new note();
			newt.pot = p;
			newt.next = n.next;
			n.next = newt;
		}
	}
	
	//初始化100个顶点的有向随机图
	static note[] init(){
		Random r = new Random();
		
		int firp,desp;//分别代表生成随机边的起点和终点
		
		note[] pot = new note[100];//生成100个点
		for(int j = 0;j < 100;j ++){
			pot[j] = new note();//初始化顶点
		}
		
		for(int i = 0;i < 3000;i ++){ //生成3000条边
			firp = r.nextInt(100); //起点
			desp = r.nextInt(100); //终点
			insert(pot[firp],desp); //边存到邻接链表中
		}
		return pot;
	}
	
	//展示邻接链表
	static void display(note[] nt){
		note tem;
		for(int i = 0;i < 100;i ++){
			tem = nt[i];
			System.out.print("第"+i+"个点连接:");
			while(tem.next!=null){
				tem = tem.next;
				System.out.print(tem.pot + "-");
			}
			System.out.println("");
		}
	}
	
	//入队
	static void push(int[] que,int end,int pot){
		que[end] = pot;
	}
	
	static int pop(int fst){
		fst = fst + 1;
		return fst;
	}
	
	public static void main(String args[]){
		note[] link;		//邻接链表
		link = init();		//初始化
//		display(link);
		
		System.out.println("请随机输入一个0-99间的数,作为源点");
		int first;			//源点
		Scanner sc = new Scanner(System.in);
		first = sc.nextInt();
		
		char[] color = new char[100];
		for(int i = 0;i < 100;i ++){
			color[i] = 'w';
		}
		int[] dest = new int[100];
		for(int j = 0;j < 100;j ++){
			dest[j] = -1;
		}
		
		int fst,end;
		int[] queue = new int[200];			//顶点队列
		push(queue,0,first);
		end = 1;
		fst = 0;
		dest[queue[fst]] = 0;
		color[queue[fst]] = 'g';
		while(end > fst){
			note t = link[queue[fst]];
			while(t.next!=null){
				t = t.next;
				if(color[t.pot]=='w'){
					color[t.pot] = 'g';
					dest[t.pot] = dest[queue[fst]] + 1;
					push(queue,end,t.pot);
					end ++;
				}
			}
			color[queue[fst]] = 'b';
			fst = pop(fst);	
		}
		
		System.out.println("");
		for(int j = 0;j < 100;j ++){
			System.out.print("点"+j+"到源点的距离为:  ");
			System.out.println(dest[j]);
		}
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值