图
1、高频考点
1.1、DFS遍历图
1.1.1、邻接表
int n,MAXV;
//n为图中节点数目
vector<int> adj[n];
bool visit[MAXV] = {false};
void DFS(int start,int depth){
visit[start] = true;
for(int i = 0;i < adj[start].size();i++){
int v = visit[adj[start][i]];
if(v == false){
DFS(v,depth + 1);
}
}
}
//如果有多个连通块
void DFSTral(){
for(int u = 0;u < n;u++){
if(visit[u] == false){
DFS(u,1);
}
}
}
1.1.2、二维数组(邻接矩阵)
1.2、BFS遍历图
1.2.1、邻接表
int n,MAXV;
//n为节点数
vector<int> adj[n];
bool inq[MAXV] = {false};
void BFS(int u){
queue<int> q;
q.push(u);
inq[u] = true;
while(!q.empty()){
int cur = q.front();
q.pop();
for(int i = 0;i < adj[cur].size();i++){
int v = adj[cur][i];
if(inq[v] == false){
q.push(v);
inq[v] = true;
}
}
}
}
1.3、dijkstra算法求最短路径
const int inf;
int n,maxn;
int d[maxn],e[maxn][maxn];
bool visit[maxn] = {false};
vector<int> pre[maxn];
//start为出发点
void dijkstra(int start){
fill(d,d + maxn,inf);
d[start] = 0;
for(int i = 0;i < n;i++){
int u = -1,minn = inf;
for(int j = 0;j < n;j++){
if(minn > d[j]){
u = j;
minn = d[j];
}
}
if(u == -1) break;
visit[u] = true;
for(int v = 0; v < n;v++){
if(visit[v] == false && e[u][v] != inf){
if(d[v] > d[u] + e[u][v]){
d[v] = d[u] + e[u][v];
pre[v].clear();
pre[v].push_back(u);
}
}
}
}
}