#pragma once
#include<iostream>
#include <vector>
#include <cassert>
#include <queue>
using namespace std;
class linkedGraph
{
public:
linkedGraph(int n,bool directed);
~linkedGraph();
int V() { return n; }
int E() { return m; }
bool hasEdge(int v, int w)
{
assert(v < n&&v >= 0);
assert(w < n && w >= 0);
for (int i = 0; i < g[v].size(); i++)
{
if (g[v][i]==w)
{
return true;
}
}
return false;
}
void addEdge(int v, int w);
void showEdge(int v)
{
assert(v < n&&v >= 0);
for (int i=0;i<g[v].size();i++)
{
cout << g[v][i] << " ";
}
cout << endl;
}
void DFS(int v)
{
for (int i = 0; i < n; i++)
{
if (!visited[g[v][i]])
{
dfs(g[v][i]);
connectedNum++;
}
}
cout << endl;
//重新归0
fill(visited, visited + n, false);
}
void BFS(int w);
int showShortedLength(int w)
{
assert(w >= 0 && w < n);
return distanceFromSource[w];
}
private:
int n, m;
int connectedNum;//判断图的联通性
bool directed;
bool *visited;
int *distanceFromSource;
int *From;
vector<vector<int>>g;
void dfs(int v);//深度优先遍历
};
linkedGraph::linkedGraph(int n, bool directed)
{
this->n = n;
this->m = 0;
connectedNum = 0;
this->directed = directed;
visited = new bool[n];
From = new int[n];
distanceFromSource = new int[n];
for (int i=0;i<n;i++)
{
g.push_back(vector<int>());
visited[i] = false;
From[i] = -1;
distanceFromSource[i] = -1;
}
}
linkedGraph::~linkedGraph()
{
delete[]distanceFromSource;
delete[]From;
delete[]visited;
}
inline void linkedGraph::addEdge(int v, int w)
{
assert(v >= 0 && v < n);
assert(w >= 0 && w < n);
if (directed)
{
if (!hasEdge(v, w) && v != w)
{
g[v].push_back(w);
m++;
}
}
else
{
if (!hasEdge(v, w) && v != w)
{
g[v].push_back(w);
g[w].push_back(v);
m++;
}
}
}
inline void linkedGraph::BFS(int w)
{
assert(w >= 0 && w < n);
queue<int> q;
q.push(w);
visited[w] = true;
From[w] = 0;
while (!q.empty())
{
int qFront = q.front();
cout << qFront << " ";
q.pop();
for (int i = 0; i < g[qFront].size(); i++)
{
if (!visited[g[qFront][i]])
{
q.push(g[qFront][i]);
visited[g[qFront][i]] = true;
From[g[qFront][i]] = qFront;
distanceFromSource[g[qFront][i]] = distanceFromSource[qFront] + 1;
}
}
}
fill(visited, visited + n, false);
}
inline void linkedGraph::dfs(int v)
{
cout << v << " ";
visited[v] = true;
for (int i = 0; i < g[v].size(); i++)
{
if (!visited[g[v][i]])
{
dfs(g[v][i]);
}
}
}