数据结构---图
一、图
图太复杂了,而且自己也开始偷懒了,只上代码
graph.cs
Code
using System;
using System.Collections.Generic;
public struct EdgeNode //带权值的边
{
public EdgeNode(int init,int end,int weight)
{
this.init = init;
this.end = end;
this.weight = weight;
}
public int init; //边的起点
public int end; //边的终点
public int weight; //边的权值
}
public class Graph
{
public const int MaxSize = 10;
public const int MaxWeight = 9999;
public int[] visited= new int[MaxSize];//访问标记数组
public char[] vertex = new char[MaxSize];//图的节点集合
public int[,] mat = new int[MaxSize,MaxSize];//图的邻接矩阵
public int vertCount; //图的节点数
public int edgeCount; //图的边数
public Graph()
{
int i,j;
for(i=0;i<MaxSize;i++) //初始化节点集合
vertex[i]=' ';
for(i=0;i<MaxSize;i++) //初始化图的邻接矩阵
for(j=0;j<MaxSize;j++)
if(i==j)
mat[i,j]=0; //数据元素权值为0
else
mat[i,j]=MaxWeight; //权值为无穷大
vertCount =0;
edgeCount =0;
}
public void CreateGraph(int n,char[] vert,int m,EdgeNode[] edge)
{
vertCount = n; //图的节点个数
int i,j,k;
for(i=0;i<n;i++) //初始化节点个数
vertex[i] = vert[i];
edgeCount = m; //图的边数
for(k=0;k<m;k++) //初始边值加入邻接矩阵
{
i=edge[k].init; //边的起点
j=edge[k].end; //边的终点
mat[i,j] = edge[k].weight; //边的权值
}
}
public void output(Graph g)
{
int i,j;
for(i=0;i<g.vertCount;i++)
Console.Write(g.vertex[i]+", ");
Console.WriteLine();
for(i=0;i<g.vertCount;i++)
{
for(j=0;j<g.vertCount;j++)
if(g.mat[i,j]==MaxWeight)
Console.Write("&\t");
else
Console.Write(g.mat[i,j]+"\t");
Console.WriteLine();
}
}
public void unvisited() //设置未被访问标标识
{
for(int i=0;i<vertCount;i++)
visited[i]=0;
}
public void depthfs(int k)
{
int i=k,j=0;
Console.Write(vertex[i]+" ");
visited[i]=1;
while(j<vertCount)
if(i!=j && mat[i,j]>0 && mat[i,j]<MaxSize && visited[j]==0)
depthfs(j);
else
j++;
}
public void breadthfs(int k)
{
myQueue<int> q = new myQueue<int>(vertCount);
int i = k;
Console.Write(vertex[i]+" ");
visited[i]=1;
q.EnQueue(i);
while(!q.IsEmpty())
{
i=q.DeQueue();
int j=0;
while(j<vertCount)
if(i!=j && mat[i,j]>0 && mat[i,j]<MaxSize && visited[j]==0)
{
Console.Write(vertex[j]+" ");
visited[j]=1;
q.EnQueue(j);
}
else
j++;
}
}
public void depthFirstSearch()
{
Console.WriteLine("深度优先遍历: ");
for(int k=0;k<vertCount;k++)
{
unvisited();
depthfs(k);
Console.WriteLine();
}
}
public void breadthFirstSearch()
{
Console.WriteLine("广度优先遍历:");
for(int k=0;k<vertCount;k++)
{
unvisited();
breadthfs(k);
Console.WriteLine();
}
}
public static void Main()
{
char[] vert = new char[] {'a','b','c','d','e'};
EdgeNode[] edge = new EdgeNode[]{new EdgeNode(0,1,1),new EdgeNode(0,3,1),
new EdgeNode(1,0,1),new EdgeNode(1,2,2),new EdgeNode(1,3,1),
new EdgeNode(2,1,1),new EdgeNode(2,4,1),
new EdgeNode(3,0,1),new EdgeNode(3,1,1),
new EdgeNode(4,2,1)};
//EdgeNode edge1 = new EdgeNode(1,2,3); //学会了使用重载结构体构造函数
Graph g1 = new Graph();
Graph g2 = new Graph();
g1.CreateGraph(5,vert,10,edge);
g1.output(g1);
Console.WriteLine();
g1.depthFirstSearch();
Console.WriteLine();
g1.breadthFirstSearch();
Console.WriteLine();
EdgeNode[] edge2 = new EdgeNode[]{new EdgeNode (0,1,1),new EdgeNode(1,2,1),new EdgeNode(1,3,1),
new EdgeNode(2,4,1),new EdgeNode(3,0,1)};
g2.CreateGraph(5,vert,5,edge2);
g2.output(g2);
g2.depthFirstSearch();
Console.WriteLine();
g2.breadthFirstSearch();
Console.WriteLine();
}
}
using System;
using System.Collections.Generic;
public struct EdgeNode //带权值的边
{
public EdgeNode(int init,int end,int weight)
{
this.init = init;
this.end = end;
this.weight = weight;
}
public int init; //边的起点
public int end; //边的终点
public int weight; //边的权值
}
public class Graph
{
public const int MaxSize = 10;
public const int MaxWeight = 9999;
public int[] visited= new int[MaxSize];//访问标记数组
public char[] vertex = new char[MaxSize];//图的节点集合
public int[,] mat = new int[MaxSize,MaxSize];//图的邻接矩阵
public int vertCount; //图的节点数
public int edgeCount; //图的边数
public Graph()
{
int i,j;
for(i=0;i<MaxSize;i++) //初始化节点集合
vertex[i]=' ';
for(i=0;i<MaxSize;i++) //初始化图的邻接矩阵
for(j=0;j<MaxSize;j++)
if(i==j)
mat[i,j]=0; //数据元素权值为0
else
mat[i,j]=MaxWeight; //权值为无穷大
vertCount =0;
edgeCount =0;
}
public void CreateGraph(int n,char[] vert,int m,EdgeNode[] edge)
{
vertCount = n; //图的节点个数
int i,j,k;
for(i=0;i<n;i++) //初始化节点个数
vertex[i] = vert[i];
edgeCount = m; //图的边数
for(k=0;k<m;k++) //初始边值加入邻接矩阵
{
i=edge[k].init; //边的起点
j=edge[k].end; //边的终点
mat[i,j] = edge[k].weight; //边的权值
}
}
public void output(Graph g)
{
int i,j;
for(i=0;i<g.vertCount;i++)
Console.Write(g.vertex[i]+", ");
Console.WriteLine();
for(i=0;i<g.vertCount;i++)
{
for(j=0;j<g.vertCount;j++)
if(g.mat[i,j]==MaxWeight)
Console.Write("&\t");
else
Console.Write(g.mat[i,j]+"\t");
Console.WriteLine();
}
}
public void unvisited() //设置未被访问标标识
{
for(int i=0;i<vertCount;i++)
visited[i]=0;
}
public void depthfs(int k)
{
int i=k,j=0;
Console.Write(vertex[i]+" ");
visited[i]=1;
while(j<vertCount)
if(i!=j && mat[i,j]>0 && mat[i,j]<MaxSize && visited[j]==0)
depthfs(j);
else
j++;
}
public void breadthfs(int k)
{
myQueue<int> q = new myQueue<int>(vertCount);
int i = k;
Console.Write(vertex[i]+" ");
visited[i]=1;
q.EnQueue(i);
while(!q.IsEmpty())
{
i=q.DeQueue();
int j=0;
while(j<vertCount)
if(i!=j && mat[i,j]>0 && mat[i,j]<MaxSize && visited[j]==0)
{
Console.Write(vertex[j]+" ");
visited[j]=1;
q.EnQueue(j);
}
else
j++;
}
}
public void depthFirstSearch()
{
Console.WriteLine("深度优先遍历: ");
for(int k=0;k<vertCount;k++)
{
unvisited();
depthfs(k);
Console.WriteLine();
}
}
public void breadthFirstSearch()
{
Console.WriteLine("广度优先遍历:");
for(int k=0;k<vertCount;k++)
{
unvisited();
breadthfs(k);
Console.WriteLine();
}
}
public static void Main()
{
char[] vert = new char[] {'a','b','c','d','e'};
EdgeNode[] edge = new EdgeNode[]{new EdgeNode(0,1,1),new EdgeNode(0,3,1),
new EdgeNode(1,0,1),new EdgeNode(1,2,2),new EdgeNode(1,3,1),
new EdgeNode(2,1,1),new EdgeNode(2,4,1),
new EdgeNode(3,0,1),new EdgeNode(3,1,1),
new EdgeNode(4,2,1)};
//EdgeNode edge1 = new EdgeNode(1,2,3); //学会了使用重载结构体构造函数
Graph g1 = new Graph();
Graph g2 = new Graph();
g1.CreateGraph(5,vert,10,edge);
g1.output(g1);
Console.WriteLine();
g1.depthFirstSearch();
Console.WriteLine();
g1.breadthFirstSearch();
Console.WriteLine();
EdgeNode[] edge2 = new EdgeNode[]{new EdgeNode (0,1,1),new EdgeNode(1,2,1),new EdgeNode(1,3,1),
new EdgeNode(2,4,1),new EdgeNode(3,0,1)};
g2.CreateGraph(5,vert,5,edge2);
g2.output(g2);
g2.depthFirstSearch();
Console.WriteLine();
g2.breadthFirstSearch();
Console.WriteLine();
}
}
还是用到了辅助栈,见:
作 者:doku
出 处:http://www.cnblogs.com/kulong995/
关于作者:喜欢编程,喜欢美食,专注于.NET项目开发。
版权声明:本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接。
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是作者坚持原创和持续写作的最大动力!