C# 图结构操作

仿造<<Java常用算法手册>>里面对的算法,使用C#实现了一遍. 理论知识我就不讲解了,在这本书里面已经写的非常完美!

代码如何下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace 图结构
{
    public class GraphMatrix
    {
        public static int MaxNum = 4;                       //最大顶点
        public static int MaxValue = 65535;                 //最大权值
        public char[] Vertex = new char[MaxNum];            //最多的顶点
        public int GraphType;                               //图类型0 无向图,1 有向图
        public int VertexNum;                               //顶点个数
        public int EdgeNum;                                 //边的个数
        public int[][] EdgeWeight = new int[MaxNum][];      //每条边的权值
        int[] isTrav = new int[MaxNum];                     //是否已经遍历过该顶点

        public GraphMatrix()
        {
            for (int i = 0; i < EdgeWeight.Length; i++)
            {
                EdgeWeight[i] = new int[MaxNum];
            }
        }

        //清空图
        public void ClearGraph()
        {
            for (int i = 0; i < this.VertexNum; i++)
            {
                for (int j = 0; j < this.VertexNum; j++)
                {
                    this.EdgeWeight[i][j] = GraphMatrix.MaxValue;
                }
            }
        }

        //输出图的关系
        public void OutGraph()
        {
            Console.WriteLine("\n图顶点的关系");
            Console.Write("  ");
            for (int i = 0; i < VertexNum; i++)
            {
                Console.Write(Vertex[i]+" ");
            }

            Console.WriteLine();

            for (int i = 0; i < VertexNum; i++)
            {
                Console.Write(Vertex[i] + " ");

                for (int j = 0; j < VertexNum; j++)
                {
                    if (EdgeWeight[i][j] == GraphMatrix.MaxValue)
                        Console.Write("Z ");
                    else
                        Console.Write(EdgeWeight[i][j] + " ");
                }

                Console.WriteLine();
            }
        }

        //遍历图
        public void DeepTraGraph()
        {
            for (int i = 0; i < VertexNum; i++)
            {
                this.isTrav[i] = 0;
            }

            Console.Write("深度优先遍历节点: ");
            for (int i = 0; i < VertexNum; i++)
            {
                if (isTrav[i] == 0)
                {
                    DeepTraOne(i);
                }
            }

            Console.WriteLine();
        }

        //深度优先法
        protected void DeepTraOne(int n)
        {
            isTrav[n] = 1;
            Console.Write(Vertex[n]);

            //遍历该节点是否跟其他节点有关联
            for (int i = 0; i < VertexNum; i++)
            {
                if(EdgeWeight[n][i] != GraphMatrix.MaxValue && isTrav[n] == 0)
                {
                    DeepTraOne(i);
                }
            }
        }

    }

}

控制台代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace 图结构
{
    class Program
    {
        static void Main(string[] args)
        {
            GraphMatrix gm = new GraphMatrix();

            gm.GraphType = 0;
            CreateGraphDemo(gm);
            gm.DeepTraGraph();

            gm.OutGraph();
            Console.ReadLine();
        }

        static void CreateGraphDemo(GraphMatrix gm)
        {
            gm.VertexNum = 4;
            gm.EdgeNum = 4;
            gm.Vertex[0] = ‘A‘;
            gm.Vertex[1] = ‘B‘;
            gm.Vertex[2] = ‘C‘;
            gm.Vertex[3] = ‘D‘;

            SetInfo(gm, ‘A‘, ‘B‘, 5);
            Console.WriteLine("第一次");
            WriterInfo(gm);
            SetInfo(gm, ‘B‘, ‘C‘, 5);
            Console.WriteLine("第二次");
            WriterInfo(gm);
            SetInfo(gm, ‘C‘, ‘D‘, 5);
            Console.WriteLine("第三次");
            WriterInfo(gm);
            SetInfo(gm, ‘D‘, ‘A‘, 5);
            Console.WriteLine("第四次");
            WriterInfo(gm);
        }

        static void SetInfo(GraphMatrix gm,int eStartV = 0,int eEndV = 0,int weight = 0)
        {
            int len = gm.Vertex.Length;

            for (int i = 0; i < len; i++)
            {
                if (gm.Vertex[i] == eStartV)
                {
                    for (int j = 0; j < len; j++)
                    {
                        if (gm.Vertex[j] == eEndV)
                        {
                            //赋值权重
                            gm.EdgeWeight[i][j] = weight;
                            if (gm.GraphType == 0)
                            {
                                gm.EdgeWeight[j][i] = weight;
                            }
                        }
                    }
                }
            }
        }

        static void WriterInfo(GraphMatrix gm)
        {
            for (int i = 0; i < gm.EdgeWeight.Length; i++)
            {
                for (int j = 0; j < gm.EdgeWeight[i].Length; j++)
                {
                    Console.Write(gm.EdgeWeight[i][j] + " ");
                }
                Console.WriteLine();
            }
            Console.WriteLine();
        }

    }
}

效果图:

时间: 2024-10-20 17:15:15

C# 图结构操作的相关文章

【数据结构】图结构操作示例

#include<iostream> #include<cstring> #include<queue> #include<stack> #include<cstdio> #define MAXNUM 20 #define MAXVALUE 65535 using namespace std; typedef struct{ //char vertex[MAXNUM][MAXNUM]; char vertex[MAXNUM][MAXNUM]; i

1.7图结构

数据元素存在3种关系: 1)先行后续,即一个数据元素有一个直接前驱和一个直接后继,这种组织结构叫线性结构: 2)层次关系,每一层上数据元素可能和下一层中的多个数据元素相关,但只和上一层中的一个数据元素相关,这类组织结构叫树结构: 3)数据元素间是"一对多"或者"多对一"的关系,即任意两个数据元素之间都可以存在关系,这类组织结构叫图结构: 图:由顶点的非空有限集合V(由N>0个顶点组成)与边的集合E(顶点之间关系)所构成的,分为有向图和无向图. 图的存储形式:邻

Theano学习笔记(三)——图结构

图结构(Graph Structures)是了解Theano内在工作原理的基础. Theano编程的核心是用符号占位符把数学关系表示出来. 图结构的组成部分 如图实现了这段代码: importtheano.tensor as T x= T.matrix('x') y= T.matrix('y') z= x + y 变量节点(variable nodes) 红色表示.变量节点都有owner,其中x与y的owner为none.z的owner为apply. 操作节点(op nodes) 绿色表示.表示

【DRP】树形结构操作之递归删除

如图所示呈现了一颗树形结构.本文从删除树形结构的任意结点出发,提供了一种解决思路 图中,不包含其它结点的是叶子结点.包含其他结点的是父结点,即不是叶子结点. 一 本文的知识点: (1)递归调用: 因为待删除的结点的层次是不确定的,如果是叶子结点则可以直接获取id直接删除,如:北京中医医院.华北区.如果待删除的结点是父结点,则需要继续向下查询,依次遍历出其子结点,从下往上依次删除,如'华北区'.因此我们使用递归调用. (2)保证事务的原子性 假设待删除的结点是'华北区',则相当于删除了3条信息(华

JavaScript实现图结构

JavaScript实现图结构 一.图论 1.1.图的简介 什么是图? 图结构是一种与树结构有些相似的数据结构: 图论是数学的一个分支,并且,在数学中,树是图的一种: 图论以图为研究对象,研究顶点和边组成的图形的数学理论和方法: 主要的研究目的为:事物之间的联系,顶点代表事物,边代表两个事物间的关系: 图的特点: 一组顶点:通常用 V (Vertex)表示顶点的集合: 一组边:通常用 E (Edge)表示边的集合: 边是顶点和顶点之间的连线: 边可以是有向的,也可以是无向的.比如A----B表示

图结构练习——最小生成树

图结构练习--最小生成树 Time Limit: 1000ms   Memory limit: 65536K  有疑问?点这里^_^ 题目描述 有n个城市,其中有些城市之间可以修建公路,修建不同的公路费用是不同的.现在我们想知道,最少花多少钱修公路可以将所有的城市连在一起,使在任意一城市出发,可以到达其他任意的城市. 输入 输入包含多组数据,格式如下. 第一行包括两个整数n m,代表城市个数和可以修建的公路个数.(n<=100) 剩下m行每行3个正整数a b c,代表城市a 和城市b之间可以修建

Linux 图形化操作

//Linux图形化操作 #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <errno.h> #include <curses.h> /*文件链接时需要加载curses共享库文件*/ int main(int arg, char *args[]) { //开启图形模式 initscr(); //不回显(不在屏

图结构练习——判断给定图是否存在合法拓扑序列

图结构练习——判断给定图是否存在合法拓扑序列 Time Limit: 1000MS Memory limit: 65536K 题目描述 给定一个有向图,判断该有向图是否存在一个合法的拓扑序列. 输入 输入包含多组,每组格式如下. 第一行包含两个整数n,m,分别代表该有向图的顶点数和边数.(n<=10) 后面m行每行两个整数a b,表示从a到b有一条有向边. 输出 若给定有向图存在合法拓扑序列,则输出YES:否则输出NO. 示例输入 1 0 2 2 1 2 2 1 示例输出 YES NO #inc

图结构练习——判断给定图是否存在合法拓扑序列(sdutoj)

#include<stdio.h>#include<string.h>int d[15],map[15][15],vis[15];int main(){    int i,j,k,f,n,m,u,v;    while(~scanf("%d%d",&n,&m))    {        memset(d,0,sizeof(d));        memset(map,0,sizeof(map));        memset(vis,0,size