data.txt
A
2,4,5
B
6
C
2,4
D
3,8
E
8
F
7,9
G
2,3
H
0
I
8
#include <iostream>
#include <string>
#include <vector>
#include <list>
#include <queue>
using namespace std;
#if 1
class Digraph
{
public:
void readFile(string filePath)
{
FILE* pf = fopen(filePath.c_str(), "r");
if (pf == nullptr)
{
throw filePath + " not exists!";
}
vertics.emplace_back("");
while (!feof(pf))
{
char line[1024] = { 0 };
fgets(line, 1024, pf);
string linestr(line);
vertics.emplace_back(linestr.substr(0, linestr.size()-1));
fgets(line, 1024, pf);
char* vertic_no = strtok(line, ",");
while (vertic_no != nullptr)
{
int vex = atoi(vertic_no);
if (vex > 0)
{
vertics.back().adjList_.emplace_back(vex);
}
vertic_no = strtok(nullptr, ",");
}
}
fclose(pf);
}
void show() const
{
for (int i = 1; i < vertics.size(); i++)
{
cout << vertics[i].data_ << " : ";
for (auto no : vertics[i].adjList_)
{
cout << no << " ";
}
cout << endl;
}
cout << endl;
}
void dfs()
{
vector<bool> visited(vertics.size(), false);
dfs(1, visited);
cout << endl;
}
void bfs()
{
vector<bool> visited(vertics.size(), false);
queue<int> que;
que.push(1);
visited[1] = true;
while (!que.empty())
{
int cur_no = que.front();
que.pop();
cout << vertics[cur_no].data_ << " ";
for (auto no : vertics[cur_no].adjList_)
{
if (!visited[no])
{
que.push(no);
visited[no] = true;
}
}
}
cout << endl;
}
void shortPath(int start, int end)
{
vector<bool> visited(vertics.size(), false);
queue<int> que;
vector<int> path(vertics.size(), 0);
que.push(start);
visited[start] = true;
while (!que.empty())
{
int cur_no = que.front();
if (cur_no == end)
{
break;
}
que.pop();
for (auto no : vertics[cur_no].adjList_)
{
if (!visited[no])
{
que.push(no);
visited[no] = true;
path[no] = cur_no;
}
}
}
if (!que.empty())
{
showPath(end, path);
}
else
{
cout << "不存在有效的最短路径!" << endl;
}
cout << endl;
}
private:
void dfs(int start, vector<bool>& visited)
{
if (visited[start])
{
return;
}
cout << vertics[start].data_ << " ";
visited[start] = true;
for (auto no : vertics[start].adjList_)
{
dfs(no, visited);
}
}
void showPath(int end, vector<int>& path)
{
if (end == 0)
return;
showPath(path[end], path);
cout << vertics[end].data_ << " ";
}
private:
struct Vertic
{
Vertic(string data)
: data_(data)
{}
string data_;
list<int> adjList_;
};
private:
vector<Vertic> vertics;
};
int main()
{
Digraph graph;
graph.readFile("data.txt");
graph.show();
graph.dfs();
graph.bfs();
cout << "================" << endl;
graph.shortPath(1, 3);
return 0;
}
#endif