zoukankan      html  css  js  c++  java
  • 有向图的邻接矩阵表示法(创建,DFS,BFS)

    package shiyan;
    
    import java.util.LinkedList;
    import java.util.Queue;
    import java.util.Scanner;
    
    public class GraphMartix {
        
    	class Vertext<AnyType>{
    		char data;
    		boolean visit;
    		public Vertext(char d){
    			this.data=d;
    			this.visit=false;
    		}
    	}
    	
    	Vertext ver[];
    	int arcs[][];
    	int verNumble;
    	//创建图
    	Scanner sc=new Scanner(System.in);
    
    	public void creatGraph(){
    		System.out.println("请输入顶点个数");
    		verNumble=sc.nextInt();
    		ver=new Vertext[verNumble];
    		arcs=new int[verNumble][verNumble];
    		for(int i=0;i<verNumble;i++){
    			for(int j=0;j<verNumble;j++){
    				arcs[i][j]=0;
    			}
    		}
    		System.out.println("请输入顶点数据");
    		String point=sc.next();
    		char p[]=point.toCharArray();
    		for(int i=0;i<p.length;i++){
    			ver[i]=new Vertext(p[i]);
    		}
    		for(int i=0;i<verNumble;i++){
    			System.out.println("请输入 所有的以"+ver[i].data+"为弧尾的边上的另一端点顶点");
    			String apoint=sc.next();
    			char ap[]=apoint.toCharArray();
    			int ap_id[]=new int[ap.length];   //存放邻接点下标
    			if(ap[0]=='*')
    				ap_id[0]=-1;
    			else{
    			    for(int x=0;x<ap.length;x++){
    				   int y=0;
    				   while(ver[y].data!=ap[x]&&y<ver.length){
    					  y++;
    				   }
    				   ap_id[x]=y;	
    			    }
    			}
    			if(ap_id[0]==-1)
    				continue;
    			for(int j=0;j<ap_id.length;j++){
    				arcs[i][ap_id[j]]=1;
    			}
    		}
    	}
    
    	public void DFS(int v){
    		ver[v].visit=true;
    		System.out.println(ver[v].data);
    		for(int i=0;i<ver.length;i++){
    			if(arcs[v][i]==1&&ver[i].visit==false)
    				DFS(i);
    		}
    	}
    	public void BFS(int v){
    		Queue<Integer> q=new LinkedList<Integer>();
    		q.add(v);
    		while(!q.isEmpty()){
    			v=q.poll();
    			if(ver[v].visit==false){
    				ver[v].visit=true;
    				System.out.println(ver[v].data);
    			}
    			for(int i=0;i<ver.length;i++){
    				if(arcs[v][i]==1&&ver[i].visit==false){
    					q.add(i);
    				}
    			}
    		}
    	}
    	public void du(){
    		int chu=0;
    		int ru=0;
    		for(int i=0;i<ver.length;i++){
    			for(int j=0;j<ver.length;j++){
    				if(arcs[i][j]==1)
    					chu++;
    				if(arcs[j][i]==1)
    					ru++;
    			}
    			
    			System.out.println(ver[i].data+"的度为: "+(chu+ru));
    			chu=0;
    			ru=0;
    		}
    	}
    	
    	public static void main(String[] args) {
    	     GraphMartix gm=new GraphMartix();
    	     gm.creatGraph();
    	     gm.du();
    	   //  gm.DFS(0);
    	     gm.BFS(0);
    
    	}
    
    }
    

  • 相关阅读:
    django中使用redis保存session(转)
    Python操作Redis(转)
    Django 中 app_name (应用命名空间) 和 namespace (实例命名空间) 的区别
    零开始Android逆向教程(一)——初探Android逆向
    python基础网络编程--转
    安全建设之平台搭建
    从信息安全弃坑到虚拟化的悲哀和无奈之感
    Apache 性能配置优化
    反爬虫和抗DDOS攻击技术实践
    DockerCon2017前瞻
  • 原文地址:https://www.cnblogs.com/oversea201405/p/3752296.html
Copyright © 2011-2022 走看看