import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
import java.util.Queue;
public class GraphExample {
private List<Object> vertexList;
private int[][] edges;
private int numOfEdges;
private boolean[] flag;
private Queue<Object> queue;
public GraphExample(int n){
edges=new int[n][n];
vertexList=new ArrayList<Object>(n);
numOfEdges=0;
flag=new boolean[n];
queue=new LinkedList<Object>();
}
public int getNumberOfVertex(){
return vertexList.size();
}
public int getNumOfEdges(){
return numOfEdges;
}
public Object getValueByIndex(int i){
return vertexList.get(i);
}
public int getWeight(int v1,int v2){
return edges[v1][v2];
}
public void insertVertex(Object vertex){
vertexList.add(vertex);
}
public void insertEdge(int weight,int v1,int v2){
edges[v1][v2]=weight;
numOfEdges++;
}
public void deleteEdge(int v1,int v2){
edges[v1][v2]=0;
numOfEdges--;
}
public int getFirstNeighbor(int index){
for(int j=0;j<vertexList.size();j++){
if(edges[index][j]>0){
return j;
}
}
return -1;
}
public int getNextNeighbor(int v1,int v2){
for(int j=v2+1;j<vertexList.size();j++){
if(edges[v1][j]>0){
return j;
}
}
return -1;
}
public void DepthFirstSearch(GraphExample g,int v0){
System.out.print(g.getValueByIndex(v0));
g.flag[v0]=true;
for(int i=0;i<g.getNumberOfVertex();i++){
if(!g.flag[i]&&g.getWeight(v0, i)!=0){
DepthFirstSearch(g,i);
}
}
}
public void BreadthFirstSearch(GraphExample g,int v0){
g.queue.offer(v0);
System.out.print(g.getValueByIndex(v0));
while(!g.queue.isEmpty()){
int vertex=(int) g.queue.poll();
for(int i=vertex;i<g.getNumberOfVertex();i++){
if(!g.flag[i]&&g.getWeight(vertex, i)!=0){
g.flag[i]=true;
System.out.print(g.getValueByIndex(i));
g.queue.offer(i);
}
}
}
}
public static void main(String[] args){
int n=4;
String labels[]={"V1","V2","V3","V4"};
GraphExample graph=new GraphExample(n);
for(String label:labels){
graph.insertVertex(label);
}
graph.insertEdge(2,0,1);
graph.insertEdge(5,0,2);
graph.insertEdge(8,2,3);
graph.insertEdge(7,3,0);
System.out.println("结点个数是:"+graph.getNumberOfVertex());
System.out.println("边数是:"+graph.getNumOfEdges());
System.out.println("获取2的下一个邻接点:"+graph.getNextNeighbor(0,1));
System.out.print("图的广度优先搜索:");
graph.BreadthFirstSearch(graph, 0);
System.out.println();
graph.deleteEdge(0, 1);
System.out.println("结点个数是:"+graph.getNumberOfVertex());
System.out.println("边数是:"+graph.getNumOfEdges());
System.out.println("获取V1的第一个邻接点:"+graph.getValueByIndex(graph.getFirstNeighbor(0)));
}
}