很久没有很细心的总结一个东西了,
这次我是真的不想再学了忘了,这次我一定会,学习后及时复习,要不然真的不如不学呀,
前面学后面就忘,这不跟没学一样么???遗忘规律我是跳不出来了,就希望自己能够跟好的学习,
更好的利用好时间吧,这是很细心的总结了建图,
大家看看:
#include
#include
#include
#include
/*
*怎么用邻接表建图
*及最简单的BFS遍历
*/
using namespace std;
const int maxv = 1111;
const int maxe = 1111;//一般无向边的数目小于为C(2, n);虽然是这么多个边数,但是,无向边需要建两次
int n;
int m;
struct Edge
{
int v;
int wight;
int next;
}e[maxe];
int head[maxv]; //头结点
int vis[maxv]; //标记点,是否被访问过.
int idx;
void Init() //初始化的操作也是很必须的! 而且一起封装起来也是很不错的选择,以后,初始化的工作还是放在Init()
{ //里面完成吧,看着封装性很好!
memset(head, -1, sizeof(head));
memset(vis, 0, sizeof(vis));
idx = 0;
}
void Addedge(int a, int b, int value) //分别为起点a,终点b,以及边的权值value
{
e[idx].wight = value;
e[idx].v = b;
e[idx].next = head[a];
head[a] = idx++; //建图的时候,一定要注意有个什么问题,用数组模拟的时候,其中边的
//下标值, 就是那个索引,找到索引就可以找到那个边,所以,索引就是你找的介质,可以当做指针,
//这就是巧妙之处.
}
void Visit_BFS(int x) // 然后外面再加一个for 循环,这就是个BFS遍历所有的点
{
if (vis[x])
{
return;
}
vis[x] = 1;
int p = head[x];
// do some thing for visiting;
printf("访问点v为 :%d\n", x);
while (p != -1)
{
int v = e[p].v; //表示你将遍历的点;
printf("访问点v为 :%d\n", v);
vis[v] = 1; //标记你已经访问了这个点;
p = e[p].next; //继续访问下一个邻接点;
}
}
void Visit_DFS(int x) // 当然如果图是一个连通图的话,就不需要加for循环了,如果没有的话,想要全部遍历完
{ // 也是要加for循环的;
if (vis[x])
{
return ;
}
// do some thing for visiting;
vis[x] = 1;
printf("访问点v为 :%d\n", x);
int p = head[x];
cout << "p == " << p << endl;
while (p != -1) //判断你要访问的下一个结点是不是被访问过了,如果访问过了就不再访问了
{
int v = e[p].v;
Visit_DFS(v);
vis[v] = 1;
p = e[p].next;
// 不回溯,,所以不需要将 vis[v] = 0;清零.
}
}
int main()
{
int a, b, val;
while (scanf("%d%d", &n, &m) !=EOF)
{
Init();
for (int i = 1; i <= m; i++)
{
scanf("%d%d%d", &a, &b, &val);
Addedge(a, b, val); //如果建无向图的话,就得加上
//Addedge(b, a, val);
}
printf("BFS遍历结果为:\n");
for (int i = 1; i <= n; i++)
{
Visit_BFS(i);
}
memset(vis, 0, sizeof(vis));
printf("DFS遍历结果为:\n");
for (int i = 1; i <= n; i++)
{
Visit_DFS(i);
}
}
system("pause");
return 0;
}
/*
5 3
1 2 1
1 3 1
3 4 1
*/