邻接矩阵中啥时候写0和无穷_图论中图的表示方法------邻接矩阵

本文介绍了一种表示图的邻接矩阵方法,通过C#实现了一个`GraphAdjMatrix`类,包括添加、删除边,获取边的权值,以及判断是否存在边的功能。在计算最短路径时,矩阵中没有边的权值被设置为无穷大。
摘要由CSDN通过智能技术生成

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.Threading.Tasks;

namespace Grapth_Test12._2

{

///

/// 邻接矩阵

///

///

public class GraphAdjMatrix

{

private Node[] nodes; //顶点数组 顶点信息

private int[,] matrix; //邻接矩阵数组  表示图的边或弧

private int numEdges; //边的数目

//初始化邻接矩阵

public GraphAdjMatrix(int n)

{

nodes = new Node[n];

matrix = new int[n, n];

}

//设置索引为index的顶点的信息

public void SetNode(int index, Node v)

{

nodes[index] = v;

}

//获取索引为index的顶点的信息

public Node GetNode(int index)

{

return nodes[index];

}

//在顶点v1和v2之间添加权值为v的边

public void SetEdge(Node v1, Node v2, int v)

{

//v1或v2不是图的顶点

if (!IsNode(v1) || !IsNode(v2))

{

Console.WriteLine("Node is not belong to Graph!");

return;

}

//矩阵是对称矩阵

matrix[GetIndex(v1), GetIndex(v2)] = v;

matrix[GetIndex(v2), GetIndex(v1)] = v;

++numEdges;

//为计算最短路径新加的代码,用来将没有边的权值设为无穷大

for (int i = 0; i < GetNumOfVertex(); i++)

for (int j = i + 1; j < GetNumOfVertex(); j++)

if (matrix[i, j] == 0)

{

//计算最短路径时,用下面的代码

//matrix[i, j] = int.MaxValue;

//matrix[j, i] = int.MaxValue;

}

}

//按给定的索引号设置两个顶点之间边

public void SetEdge(int index1, int index2)

{

matrix[index1, index2] = 1;

}

//按给定的顶点设置两个顶点之间边

public void SetEdge(Node v1, Node v2)

{

SetEdge(v1, v2, 1);

}

//删除顶点v1和v2之间的边

public void DelEdge(Node v1, Node v2)

{

//v1或v2不是图的顶点

if (!IsNode(v1) || !IsNode(v2))

{

Console.WriteLine("Node is not belong to Graph!");

return;

}

//顶点v1与v2之间存在边

if (matrix[GetIndex(v1), GetIndex(v2)] == 1)

{

//矩阵是对称矩阵

matrix[GetIndex(v1), GetIndex(v2)] = 0;

matrix[GetIndex(v2), GetIndex(v1)] = 0;

--numEdges;

}

}

//获取给定的两个索引号所对应的项点之间的边

public int GetEdge(int index1, int index2)

{

return matrix[index1, index2];

}

//获取给定的两个顶点之间边

public int GetEdge(Node v1, Node v2)

{

//v1或v2不是图的顶点

if (!IsNode(v1) || !IsNode(v2))

{

Console.WriteLine("Node is not belong to Graph!");

return 0;

}

return matrix[GetIndex(v1), GetIndex(v2)];

}

//获取顶点的数目

public int GetNumOfVertex()

{

return nodes.Length;

}

//获取边的数目

public int GetNumOfEdge()

{

return numEdges;

}

//获取顶点v在顶点数组中的索引

public int GetIndex(Node v)

{

int i = -1;

//遍历顶点数组

for (i = 0; i < nodes.Length; ++i)

{

//如果顶点v与nodes[i]相等,则v是图的顶点,返回索引值i。

if (nodes[i].Data.Equals(v.Data))

{

return i;

}

}

return i;

}

//判断顶点v1与v2之间是否存在边

public bool IsEdge(Node v1, Node v2)

{

//v1或v2不是图的顶点

if (!IsNode(v1) || !IsNode(v2))

{

Console.WriteLine("Node is not belong to Graph!");

return false;

}

//顶点v1与v2之间存在边

if (matrix[GetIndex(v1), GetIndex(v2)] == 1)

{

return true;

}

else //不存在边

{

return false;

}

}

//判断v是否是图的顶点

public bool IsNode(Node v)

{

//遍历顶点数组

foreach (Node nd in nodes)

{

//如果顶点nd与v相等,则v是图的顶点,返回true

if (v.Equals(nd))

{

return true;

}

}

return false;

}

public void PrintMatrix()

{

for (int i = 0; i < nodes.Length; i++)

{

for (int j = 0; j < nodes.Length; j++)

{

Console.Write(matrix[i,j] + " ");

}

Console.WriteLine();

}

}

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值