第一行:咕咕咕。
第二行:补一下这个,不然复习的时候还得现找模板。
第三行:未完待续
一、DFS
模板1:递归+邻接矩阵
#include <iostream>
#include <cstdio>
#include <queue>
#include <ctime>
#include <algorithm>
#include <cmath>
#include <cstring>
using namespace std;
queue<int> q;
int edge[15][15];
int n;
bool visit[15];
string s = "访问节点的顺序是:";
int tot = 0;
void dfs(int aim)
{
visit[aim] = 1;
tot++;
s = s+"节点"+char(aim+48)+" ";
if(tot == n) return;
for(int i = 1; i <= n; ++i)
{
if(!visit[i] && edge[aim][i] == 1)
{
dfs(i);
}
}
}
int main()
{
int aim;
cout<<"请输入邻接矩阵的节点个数:\n";
cin>>n;
cout<<"请输入该矩阵:\n";
for(int i = 1; i <= n; ++i)
{
for(int j = 1; j <= n; ++j)
cin>>edge[i][j];
}
cout<<"请输入起点:\n";
cin>>aim;
memset(visit,false,sizeof(visit));
dfs(aim);
cout<<s<<'\n';
return 0;
}
模板2:栈+邻接矩阵
二、BFS
模板1:队列+邻接矩阵(根据图来确定那两条边互通,并将连接起来的节点输出)
#include <iostream>
#include <cstdio>
#include <queue>
#include <ctime>
#include <algorithm>
#include <cmath>
#include <cstring>
using namespace std;
queue<int> q;
int edge[15][15];
int n;
void bfs(int aim)
{
bool visit[15];
memset(visit,false,sizeof(visit));
string s = "访问节点的顺序是:";
q.push(aim);
while(!q.empty())
{
int up = q.front();
q.pop();
s = s+"节点"+char(up+48)+" ";//形成一个字符串输出
visit[up] = true;
for(int i = 1; i <= n; ++i)
{
if(edge[up][i] == 1 && !visit[i])
{
q.push(i);
visit[i] = true;
}
}
}
cout<<s<<'\n';
}
int main()
{
int aim;
cout<<"请输入邻接矩阵的节点个数:\n";
cin>>n;
cout<<"请输入该矩阵:\n";
for(int i = 1; i <= n; ++i)
{
for(int j = 1; j <= n; ++j)
cin>>edge[i][j];
}
cout<<"请输入起点:\n";
cin>>aim;
bfs(aim);
return 0;
}
模板2:规定方向的bfs(为sdnu1086)
#include <iostream>
#include <queue>
#include <cstdio>
#include <cstring>
#include <cctype>
using namespace std;
int tu[15][15];
int vis[15][15];
struct qwq
{
int x;
int y;
string s;
};//用来存结点的横纵坐标xy和到当前结点时应该输出的路径
string bfs()
{
queue<qwq>q;
qwq d, nd;
vis[0][0] = 1;
d.x = 0;
d.y = 0;
d.s = "(0, 0)\x0A";
q.push(d);//初始化起点为0,0
int xx[4][2] = {{1, 0},{0, -1},{0, 1},{-1, 0}};//规定四个方向
int nx, ny;
while(!q.empty())
{
d = q.front();
q.pop();
for(int i = 0; i < 4; i++)
{
nx = d.x + xx[i][0];
ny = d.y + xx[i][1];
if(nx < 0||ny < 0||nx >= 5||ny >= 5)//判断该方向是否越界
continue;
else if(!vis[nx][ny]&&tu[nx][ny] == 0)//判断该点是否走过并且是否有通路0表示有路
{
vis[nx][ny] = 1;
nd.x = nx;
nd.y = ny;//标记该点并更新为当前点
char c1, c2;
c1 = nx + 48;
c2 = ny + 48;
nd.s = d.s + "(" + c1 + "," + " " + c2 + ")" + "\x0A";
q.push(nd);//将当前点的前面路径记录好并放入队列中
}
if(nx == 4&&ny == 4)
return nd.s;//如果走到末尾结点即可输出
}
}
}
int main()
{
int i, j;
string c;
memset(tu, 0, sizeof(tu));
memset(vis, 0, sizeof(vis));
for(i = 0; i < 5; ++i)
for(j = 0; j < 5; ++j)
scanf("%d", &tu[i][j]);
cout<<bfs();
return 0;
}
三、习题部分
1. SDNU1015 入门款dfs你值得拥有
2. SDNU1086 入门+1

2228

被折叠的 条评论
为什么被折叠?



