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;
}
这是读取的顶点与边的关系文件
这是打印的结果
上一篇: 淘宝开放平台API开发(一)