图的邻接矩阵实现问题

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
• 设计目的
通过对图遍历的程序编写,掌握邻接矩阵的定义,并对其进行深度优先 搜索和广度优先搜索。
• 1. 测试图的手工表示结果。
• 2. 测试图的数据表示,邻接矩阵特点。
• 邻接矩阵,对与图G,可用一个方阵A=(aij)n*n表示,其中 aij=1,表示vi和vj之间有边,为0表示无边。邻接矩阵可表 示自环和重边,在有向图中,aij表示定点vi和vj之间边的条 数。 • 无向图的邻接矩阵一定是对称的,而有向图的邻接矩阵不 一定对称。因此,用邻接矩阵来表示一个具有n个顶点的 有向图时需要n^2个单元来存储邻接矩阵;对有n个顶点的 无向图则只存入上(下)三角阵中剔除了左上右下对角线 上的0元素后剩余的元素,故只需1+2+...+(n-1)=n(n-1)/2个 单元。 • 无向图邻接矩阵的第i行(或第i列)非零元素的个数正好 是第i个顶点的度。 • 有向图邻接矩阵中第i行非零元素的个数为第i个顶点的出 度,第i列非零元素的个数为第i个顶点的入度,第i个顶点 的度为第i行与第i列非零元素个数之和。 • 用邻接矩阵表示图,很容易确定图中任意两个顶点是否有 边相连。
} //深度优先搜索方法 static void DFS(Graphm G,int v,char m[]) { System.out.print(m[v]+" "); G.setmark(v,1); for(int w=G.first(v);w<G.n();w=G.next(v,w)) if(G.getmark(w)==0) DFS(G,w,m); } //广度优先搜索方法
精品课件!
2018/10/23
5.遇到的问题
• 初次使用eclipse,很多功能都不是很熟悉。 • 小组分工不明确,导致实验进度缓慢。 • 刚开始接触java,很多语句用法和C、C++不相同,需要慢 慢摸索。
2018/10/23
• • • • • • • • • • • • • 2018/10/23
• • • • • •
void clear()
//清除图的顶点的标识信息 { for(int i=0;i<numvertex;i++) mark[i]=0; }
}

2018/10/23
4. 测试结果
精品课件!
2018/10/23
• • • • • • • • • • • • • • • • •
int next(int v1,int v2) //寻找在顶点v2后与顶点v1相邻最近的元素 { int i; for(i=v2+1;i<numvertex;i++) { if(matrix[v1][i]!=0) return i; } return i; } void setedge(int v1,int v2,int wgt) //设置由顶点v1与v2构成的边 的权重 { if(matrix[v1][v2]==0) numedge++; matrix[v1][v2]=wgt; } void deledge(int v1,int v2) //删除由顶点v1与v2构成的边
//返回图中边的个数 return numedge;
}
int first(int v) //寻找与顶点v相邻最近的元素 { int i; for(i=0;i<numvertex;i++) { if(matrix[v][i]!=0) return i; } return i; }
• • • • • • • • • 2018/10/23 •
• } 2018/10/23 • }
• • • • •
/** * 图类 * @author Administrator * */
• • • • • • • • •
class Graphm{
int numvertex,numedge; //图中顶点的个数numvertex,与边 的个数numedge public int matrix[][]=new int[8][8]; //二维矩阵,用于存储边的 信息 int mark[]=new int[8]; //数组,用于存储图中的顶点是否被访 问 public Graphm(int numvert) //图的构造函数 { int i,j; numvertex=numvert; numedge=0;
2018/10/23
• • • • •
{
if(matrix[v1][v2]!=0) numedge--; matrix[v1][v2]=0;
} int weight(int v1,int v2) //返回由顶点v1与v2构成的边的权重 { return matrix[v1][v2]; } int getmark(int v) //返回顶点v的标识信息 { return mark[v]; } void setmark(int v,int val) //设置顶点v的标识信息 { mark[v]=val; } void clear() //清除图的顶点的标识信息
• 3. 图的类设计方法。
对于深度优先搜索我们采用递归操作;广度优先搜索采用非递归 操作,在此过程中引用栈消除递归。 类DFS用于深度优先搜索,栈g1为其边赋值。 类BFS用于广度优先搜索,栈g2为其边赋值。 图类Graphm用于定义图中顶点和边的相关信息。
源程序:
public class BFS { /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub char m[]={'a','b','c','d','e','f','g','h'}; Graphm g1=new Graphm(8); //给图的边赋值 g1.setedge(0, 1, 1); g1.setedge(1, 3, 1); g1.setedge(1, 4, 1); g1.setedge(3, 7, 1); g1.setedge(4, 7, 1); g1.setedge(0, 2, 1); g1.setedge(2, 5, 1); g1.setedge(2, 6, 1); g1.setedge(5, 6, 1);
2018/10/23
• • • • • • • • • • • •
for(i=0;i<numvertex;i++)
for(j=0;j<numvertex;j++) matrix[i][j]=0;//赋初值没被访问0
} int n() { } int e() { //返回图中顶点的个数
return numvertex;
• • • • • • • • • • • • • • • • • • • • • •
static void BFS(Graphm G,int start,char m[],int v1) { int v,w; int vn=v1+1; int qu[]=new int[vn]; int front,rear; front=rear=0; rear++; qu[rear]=m[start]; G.setmark(start,1); while(front!=rear) { front=(front+1)%vn; v=qu[front]-97; System.out.print(m[v]+" "); for(w=G.first(v);w<G.n();w=G.next(v,w)) if(G.getmark(w)==0) { G.setmark(w,1); qu[++rear]=m[w]; } }
2018/10/23
• • • • • • • • • • • • • • • • • •
ห้องสมุดไป่ตู้
// // // // // // // // // // // // // // // // //
//深度优先搜索方法 System.out.println("深度优先输出:"); DFS(g1,0,m); System.out.println(); Graphm g2=new Graphm(8); //给图的边赋值 g2.setedge(0, 1, 1); g2.setedge(1, 3, 1); g2.setedge(1, 4, 1); g2.setedge(3, 7, 1); g2.setedge(4, 7, 1); g2.setedge(0, 2, 1); g2.setedge(2, 5, 1); g2.setedge(2, 6, 1); g2.setedge(5, 6, 1); System.out.println("广度度优先输出:"); BFS(g2,0,m,8);
2018/10/23
• • • • • • • • • • • • • • • • •
2018/10/23
for(int i=0;i<8;i++){
for(int j=0;j<8;j++){ System.out.print(g1.matrix[i][j]+" "); } System.out.println(); }
相关文档
最新文档