//图
//图由边和定点来表示,可以抽象为像是世界中的一种模型
class Vertex{
private char label;
private boolean wasVisited;
public Vertex(char c){
this.label=c;
wasVisited=false;
}
public void showVertex(){
System.out.print(label+" ");
}
public char getVertex(){
return label;
}
public void setVisited(){
wasVisited=true;
}
public boolean wasVisited(){
return wasVisited;
}
}
class Graph{
private Vertex[] vertexList;
private int[][] adjMat;
private int nVertex;
private int sCount;
public Graph(int num){
vertexList=new Vertex[num];
adjMat=new int[num][num];
for(int i=0;i<num;i++){
for(int j=0;j<num;j++){
adjMat[i][j]=0;
}
}
nVertex=0;
sCount=0;
}
public void insertVertex(char c){
vertexList[nVertex]=new Vertex(c);
nVertex++;
}
public void insertEdge(int s,int d){
adjMat[s-1][d-1]=1;
adjMat[d-1][s-1]=1;
}
public void showV(){
for(int i=0;i<nVertex;i++){
vertexList[i].showVertex();
}
}
public void showEdge(){
for(int i=0;i<nVertex;i++){
for(int j=i;j<nVertex;j++){
if(adjMat[i][j]==1){
char s=vertexList[i].getVertex();;
char d=vertexList[j].getVertex();
System.out.print(s+"<->"+d+" ");
}
}
}
}
public void DFS(){
Stack1 s=new Stack1(nVertex);
s.push(0);
vertexList[0].setVisited();
System.out.print(vertexList[0].getVertex());
while(!s.isEmpty()){
int v=s.getPeek();
int w=getAdjVertex(v);
if(w!=-1){
s.push(w);
vertexList[w].setVisited();
System.out.print(vertexList[w].getVertex());
}
else{
s.pop();
}
}
}
public int getAdjVertex(int v){
for(int j=0;j<nVertex;j++){
if(adjMat[v][j]==1&&vertexList[j].wasVisited()==false){
vertexList[j].setVisited();
return j;
}
}
return -1;
}
}
class Stack1{
private int[] sArray;
private int size;
public Stack1(int s){
sArray=new int[s];
size=0;
}
public void push(int v){
sArray[size]=v;
size++;
}
public void pop(){
size--;
}
public boolean isEmpty(){
return size==0;
}
public int getPeek(){
return sArray[size-1];
}
}
public class GraphTest{
public static void main(String[] args){
Graph g=new Graph(5);
g.insertVertex('A');
g.insertVertex('B');
g.insertVertex('C');
g.insertVertex('D');
g.showV();
g.insertEdge(1,2);
g.insertEdge(1,3);
g.insertEdge(3,4);
g.showEdge();
g.DFS();
}
}
//图由边和定点来表示,可以抽象为像是世界中的一种模型
class Vertex{
private char label;
private boolean wasVisited;
public Vertex(char c){
this.label=c;
wasVisited=false;
}
public void showVertex(){
System.out.print(label+" ");
}
public char getVertex(){
return label;
}
public void setVisited(){
wasVisited=true;
}
public boolean wasVisited(){
return wasVisited;
}
}
class Graph{
private Vertex[] vertexList;
private int[][] adjMat;
private int nVertex;
private int sCount;
public Graph(int num){
vertexList=new Vertex[num];
adjMat=new int[num][num];
for(int i=0;i<num;i++){
for(int j=0;j<num;j++){
adjMat[i][j]=0;
}
}
nVertex=0;
sCount=0;
}
public void insertVertex(char c){
vertexList[nVertex]=new Vertex(c);
nVertex++;
}
public void insertEdge(int s,int d){
adjMat[s-1][d-1]=1;
adjMat[d-1][s-1]=1;
}
public void showV(){
for(int i=0;i<nVertex;i++){
vertexList[i].showVertex();
}
}
public void showEdge(){
for(int i=0;i<nVertex;i++){
for(int j=i;j<nVertex;j++){
if(adjMat[i][j]==1){
char s=vertexList[i].getVertex();;
char d=vertexList[j].getVertex();
System.out.print(s+"<->"+d+" ");
}
}
}
}
public void DFS(){
Stack1 s=new Stack1(nVertex);
s.push(0);
vertexList[0].setVisited();
System.out.print(vertexList[0].getVertex());
while(!s.isEmpty()){
int v=s.getPeek();
int w=getAdjVertex(v);
if(w!=-1){
s.push(w);
vertexList[w].setVisited();
System.out.print(vertexList[w].getVertex());
}
else{
s.pop();
}
}
}
public int getAdjVertex(int v){
for(int j=0;j<nVertex;j++){
if(adjMat[v][j]==1&&vertexList[j].wasVisited()==false){
vertexList[j].setVisited();
return j;
}
}
return -1;
}
}
class Stack1{
private int[] sArray;
private int size;
public Stack1(int s){
sArray=new int[s];
size=0;
}
public void push(int v){
sArray[size]=v;
size++;
}
public void pop(){
size--;
}
public boolean isEmpty(){
return size==0;
}
public int getPeek(){
return sArray[size-1];
}
}
public class GraphTest{
public static void main(String[] args){
Graph g=new Graph(5);
g.insertVertex('A');
g.insertVertex('B');
g.insertVertex('C');
g.insertVertex('D');
g.showV();
g.insertEdge(1,2);
g.insertEdge(1,3);
g.insertEdge(3,4);
g.showEdge();
g.DFS();
}
}