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();
}
}
}
}