ACM13
1. 图
存储方式
邻接矩阵
特点:存储空间大小为n*n,耗费空间大;1表示两顶点之间有链接,0表示无链接;
邻接表
特点:存储空间为n+2e,存储空间随时分配,所需时间长,以时间换空间;
遍历方式
<1>深度优先遍历
本质:实质上是利用栈,运用递归,遍历出各顶点的值;
效果:先找到第一个顶点,再找到顶点的邻点,类推,
一直向深度延伸,只有无路可走时,return;递归回去;
(就想一个倔强的孩子,只要有路,一直向前冲,不到死路不回头)
框架:
#include<cstdio>
#include<string.h>
const int MAX=10;
int map[MAX][MAX];
int vis[MAX];
int a[MAX];
int i,j,sum=0;
void dfs(int v)
{
vis[v]=1;//给第一个顶点标记
sum++;//统计已走过的顶点数
if(sum==MAX)
return ;
for(i=1;i<=MAX;i++)
{
if(map[v][i]==1&&!vis[i])//寻找未被走过的顶点且与顶点有连接的点
{
vis[i]=1;//给新点一个标记
dfs(i);//查找与该点相连的点,有继续找,直到没有与该顶点相连的点或已经走过了所有的顶点后,跳出循环,递归回去;
}
}
return ;
}
int main()
{
memset(vis,0,sizeof(vis));
for(i=0;i<MAX;i++)
{
for(j=0;j<MAX;j++)
{
map[i][j]//地图编写;
}
}
}
<2>广度优先遍历
本质:运用队列,遍历出各顶点的值;
思路:类似于层次树,首先找到一个顶点,找到它的相邻顶点,让邻点入队,然后此顶点出队;
框架:
#include<stdio.h>
#include<queue>
using namespace std;
int map[100][100];
bool vis[100]={false};
queue<int>s;
void bfs(int v)
{
vis[v]=1;
for(int i=0;i<=100;i++)
{
if(map[v][i]==1&&!vis[i])
{
s.push(i);
vis[i]=1;
}
}
s.pop();
}