邻接表_BFS()

来源:互联网 发布:vb中left函数 编辑:程序博客网 时间:2024/05/02 10:48

不知道的还以为很神奇的呢,其实这就是思想散发出的光芒,只要你懂得了思想你做什么都可以

很ok的弄明白,并且很轻松的实现.

这就是思想的重要性.

一会我就拿邻接表把最短路呀,最小生成树的prim算法都实现一个遍.

贴出代码:

#include <stdio.h>#include <string.h>#include <iostream>#include <string>#include <queue>using namespace std;const int maxv = 111;const int maxe = 1111;int N;int M;int head[maxv];struct Edge{int v;//int wight;int next;}e[maxe];int idx;int vis[maxv];void Init(){memset(head, -1, sizeof(head));memset(vis, 0, sizeof(vis));idx = 0;}void addEdge(int a, int b){e[idx].v = b;//e[idx].wight = val;e[idx].next = head[a];head[a] = idx++;}void BFS(int x){queue <int > q;q.push(x);while (!q.empty()){int x = q.front();q.pop();if (!vis[x])//从队列里面拿出来的点也是要判断一下的,因为可能存进去的是同一个点 {vis[x] = 1;//这个点已经被访问了,因为你建的是双向图; cout << x << endl;}else{continue;}int p = head[x];while (p != -1){int v = e[p].v;if (!vis[v])//如果没有被访问才放进去,如果已经访问了,就不能放进去了,要不然就无线循环了 {q.push(v);}p = e[p].next;}}}int main(){while (scanf("%d%d", &N, &M) != EOF){Init();int a, b;for (int i = 1; i <= M; i++){scanf("%d%d", &a, &b);addEdge(a, b);addEdge(b, a);}BFS(1);} system("pause");return 0;}

原创粉丝点击