Data Structure: Graph implementation-Adjacent matrix

Source: Internet
Author: User

Implementation of the adjacent matrix of the graph Structure

To represent the Association between vertices in a graph, we can use the adjacent matrix to implement the graph structure. The so-called adjacent matrix is a two-dimensional array that reflects the link between edges. The two-dimensional array is represented by Matrix [numv] [numv], where numv is the number of vertices.

For a no-Permission Graph

If an edge exists between vertex VI and vj, matrix [VI] [VJ] = 1; otherwise, matrix [VI] [VJ] = 0.

Right chart

If the vertex VI and vj have edges and the weight is weight, matrix [VI] [VJ] = weight; otherwise, matrix [VI] [VJ] = 0 or maxweight (obtain the minimum or maximum weight ).


The following is an example.

Class Definition

# Include <iostream> # include <iomanip> using namespace STD; // maximum weight # define maxweight 100 // graph class graph {private using an adjacent matrix: // whether bool isweighted is authorized; // whether bool isdirected is available; // Number of vertices int numv; // Number of edges int nume; // The adjacent matrix int ** matrix; public:/* constructor numv indicates the number of vertices, whether isweighted has a weight value, and whether isdirected has a direction */graph (INT numv, bool isweighted = false, bool isdirected = false ); // create a graph void creategraph (); // The Destructor ~ Graph (); // get the number of vertices int getvernums () {return numv;} // get the number of edges int getedgenums () {return nume ;} // set the value of the specified edge void setedgeweight (INT tail, int head, int weight); // print the adjacent matrix void printadjacentmatrix (); // check the input bool check (int I, Int J, int W = 1 );};
Class implementation

/* Constructor numv indicates the number of vertices, whether isweighted has a weight value, and whether isdirected has a direction */graph: Graph (INT numv, bool isweighted, bool isdirected) {While (numv <= 0) {cout <"the number of input vertices is incorrect !, Enter "; CIN> numv;} This-> numv = numv; this-> isweighted = isweighted; this-> isdirected = isdirected; matrix = new int * [numv]; // pointer array int I, j; for (I = 0; I <numv; I ++) matrix [I] = new int [numv]; // initialize the image if (! Isweighted) // No permission graph {// The ownership value is initialized to 0for (I = 0; I <numv; I ++) for (j = 0; j <numv; j ++) matrix [I] [J] = 0;} else // permission graph {// The maximum value of ownership is initialized to (I = 0; I <numv; I ++) for (j = 0; j <numv; j ++) matrix [I] [J] = maxweight ;}// create a diagram void graph: creategraph () {cout <"Number of input edges"; while (CIN> nume & nume <0) cout <"incorrect input !, Enter "; int I, j, W; If (! Isweighted) // No permission graph {If (! Isdirected) // undirected graph {cout <"Enter the start and end points of each edge: \ n"; for (int K = 0; k <nume; k ++) {CIN> I> J; while (! Check (I, j) {cout <"the input edge is incorrect! Re-input \ n "; CIN> I> J;} matrix [I] [J] = matrix [J] [I] = 1 ;}} else // directed graph {cout <"input start and end of each edge: \ n"; for (int K = 0; k <nume; k ++) {CIN> I> J; while (! Check (I, j) {cout <"the input edge is incorrect! Re-enter \ n "; CIN> I >> J;} matrix [I] [J] = 1 ;}} else // you can view the {If (! Isdirected) // undirected graph {cout <"Enter the start, end, and weight of each edge: \ n"; for (int K = 0; k <nume; k ++) {CIN> I> j> W; while (! Check (I, j, W) {cout <"the input edge is incorrect! Re-input \ n "; CIN> I> j> W;} matrix [I] [J] = matrix [J] [I] = W ;}} else // directed graph {cout <"input start, end, and weight of each edge: \ n"; for (int K = 0; k <nume; k ++) {CIN> I> j> W; while (! Check (I, j, W) {cout <"the input edge is incorrect! Re-input \ n "; CIN> I> j> W;} matrix [I] [J] = W ;}}// destructor graph :: ~ Graph () {int I = 0; for (I = 0; I <numv; I ++) Delete [] matrix [I]; Delete [] matrix ;} // set the weight of the specified edge void graph: setedgeweight (INT tail, int head, int weight) {If (isweighted) {While (! Check (tail, Head, weight) {cout <"incorrect input. re-enter the start, end, and weight of the edge "; cin> tail> head> weight;} If (isdirected) matrix [tail] [head] = weight; elsematrix [tail] [head] = matrix [head] [tail] = weight;} else {While (! Check (tail, Head, 1) {cout <"incorrect input, re-enter the start and end points of the edge"; CIN> tail> head;} If (isdirected) matrix [tail] [head] = 1-matrix [tail] [head]; elsematrix [tail] [head] = matrix [head] [tail] = 1-matrix [tail] [head] ;}// input to check bool graph :: check (int I, Int J, int W) {if (I> = 0 & I <numv & J> = 0 & J <numv & W> 0 & W <= maxweight) return true; elsereturn false;} // print the adjacent matrix void graph: printadjacentmatrix () {int I, j; cout. SETF (IOs: Left); cout <SETW (4) <""; for (I = 0; I <numv; I ++) cout <SETW (4) <I; cout <Endl; for (I = 0; I <numv; I ++) {cout <SETW (4) <I; for (j = 0; j <numv; j ++) cout <SETW (4) <matrix [I] [J]; cout <Endl ;}}
Main Function

Int main () {cout <"******* use the adjacent matrix to implement the graph structure ***** by David ***" <Endl; bool isdirected, isweighted; int numv; cout <"Graph" <Endl; cout <"Number of input vertices"; CIN> numv; cout <"indicates whether an edge has a weight, 0 (without) or 1 (with) "; CIN> isweighted; cout <" whether it is a directed graph, 0 (undirected) or 1 (directed )"; cin> isdirected; graph (numv, isweighted, isdirected); cout <"this is a"; isdirected? Cout <",": cout <","; isweighted? Cout <" 图" <Endl: cout <" 图" <Endl; graph. creategraph (); cout <"Print adjacent matrix" <Endl; graph. printadjacentmatrix (); cout <Endl; int tail, Head, weight; cout <"Modify the weight of a specified edge" <Endl; If (isweighted) // For the permission graph {cout <"Start Point, end point, and weight of the input edge"; CIN> tail> head> weight; graph. setedgeweight (tail, Head, weight);} else // For the Untitled graph {cout <"start and end of the input edge"; CIN> tail> head; graph. setedgeweight (tail, Head, 1);} cout <" Modified successfully! "<Endl; cout <" Print adjacent matrix "<Endl; graph. printadjacentmatrix (); System (" pause "); Return 0 ;}
Run

Instance 1


Instance 2




Download complete code: Graph structure implementation: adjacent matrix


Reprint please indicate the source, this article address: http://blog.csdn.net/zhangxiangdavaid/article/details/38321327


If this is helpful, try again!


Column Directory: Data Structure and algorithm directory


Contact Us

The content source of this page is from Internet, which doesn't represent Alibaba Cloud's opinion; products and services mentioned on that page don't have any relationship with Alibaba Cloud. If the content of the page makes you feel confusing, please write us an email, we will handle the problem within 5 days after receiving your email.

If you find any instances of plagiarism from the community, please send an email to: info-contact@alibabacloud.com and provide relevant evidence. A staff member will contact you within 5 working days.

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.