欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

C++实现图论邻接表

程序员文章站 2022-03-05 14:50:21
...

用C++实现图论中的邻接表,用的STL中vector和list实现

这是AdjList.h文件

#pragma once
#include <iostream>
#include <list>
#include <vector>
#include <fstream>
#include <cassert>

using namespace std;

class AdjList
{
private:
	int V;//顶点数
	int E;//边数
	vector<list<int>> adjlist;//用于存储每个顶点的相邻顶点
    //vector中有V个list,每个list里面是各个顶点的相邻顶点
	
	void validateVertex(int v) {//用于验证输入顶点的有效性
		if (v < 0 || v >= V)
		{
			cout << "vertex " << v << " is invalid" << endl;
		}
	}

public:
	AdjList(){
		V = 0;
		E = 0;
	}
	AdjList(string filename) {//读取顶点与边的关系文件
		ifstream file;
		file.open(filename.data());
		assert(file.is_open());

		//读取 V 和 E 的值
        //前两个值是顶点个数和边数
		char c;
		file >> c;
		V = c - '0';
		file >> c;
		E = c - '0';

		//初始化vector list列表
		for (int i = 0; i < V; i++)
		{
			list<int> ve_list;
			adjlist.push_back(ve_list);
		}

        //读取两个顶点,即一条边,这个无向图,所有两边都要加入
		for (int i = 0; i < E; i++)
		{
			file >> c;
			int a = c - '0';
			file >> c;
			int b = c - '0';
			adjlist[a].push_back(b);
			adjlist[b].push_back(a);
		}
	}
	~AdjList() {
	}

	int getV() {
		return V;
	}
	int getE() {
		return E;
	}
	bool contain(int v, int w) {//看两个顶点是否相邻
		for (auto it : adjlist[v]) {
			if (it == w)
				return true;
		}
		return false;
	}

	list<int> neborlist(int v) {//获取相邻顶点的列表
		validateVertex(v);
		return adjlist[v];
	}

	bool hasEdge(int v, int w) {//看两顶点之间是否有边
		validateVertex(v);
		validateVertex(w);
		return contain(v, w);
	}
	int degree(int v) {//看顶点的度
		return adjlist[v].size();
	}
	void listprint() {//打印邻接表
		for (int v = 0; v < V; v++)
		{
			cout << v << " : ";
			for (auto it : adjlist[v])
				cout << it << "  ";
			cout << endl;
			cout << adjlist[v].size() << endl;
		}
	}
	void printlist(list<int>& temp) {
		for (auto it : temp )
		{
			cout << it << "  ";
		}
		cout << endl;
	}
};

这个是main文件

#include <iostream>
#include <list>
//#include "AdjMatrix.h"
#include <vector>
#include "AdjList.h"
//#include"GraphDFS.h"
using namespace std;

int main() {
	AdjList* adjList = new AdjList("g.txt");
	adjList->listprint();
	
	return 0;
}

这是读取的顶点与边的关系文件

C++实现图论邻接表

这是打印的结果

C++实现图论邻接表