第六章部分例题 双向bfs邻接表和邻接矩阵实现

Idealpath 双向bfs输出颜色,邻接矩阵实现

  1 #include <iostream>
  2 #include <cstdio>
  3 #include <cstring>
  4 #include <queue>
  5 #include <map>
  6 #include <algorithm>
  7
  8 using namespace std;
  9
 10 const int maxn=10000;
 11 const int inf=1000000;
 12 int G[maxn][maxn];
 13 int d[maxn];
 14 int vis[maxn];
 15 queue<int> q;
 16 map<int,int> ma;
 17 int path[maxn];
 18 int m,n;
 19
 20 void init()
 21 {
 22     for(int i=0;i<m;i++)
 23     {
 24         int l1,l2,rgb;
 25         cin>>l1>>l2>>rgb;
 26
 27         //cout<<l1<<" "<<l2<<endl;
 28
 29         G[l1][l2]=G[l2][l1]=rgb;
 30     }
 31 }
 32
 33 void bfs(int dst)
 34 {
 35     memset(d,inf,sizeof(d));
 36
 37     q.push(dst);
 38     vis[dst]=1;
 39     d[dst]=0;
 40
 41
 42     while(!q.empty())
 43     {
 44         int node=q.front();
 45         q.pop();
 46
 47         for(int i=1;i<=n;i++)
 48             if(G[node][i]>0)
 49                 if(!vis[i])
 50                 {
 51                     d[i]=d[node]+1;
 52
 53                     q.push(i);
 54                     vis[i]=1;
 55                 }
 56     }
 57
 58 }
 59
 60
 61 void p_bfs(int dst)
 62 {
 63     memset(vis,0,sizeof(vis));
 64
 65     q.push(1);
 66
 67     while(!q.empty())
 68     {
 69         int node=q.front();
 70         q.pop();
 71
 72         if(node==dst) break;
 73
 74         for(int i=1;i<=n;i++)
 75             if(G[node][i]>0)
 76                 if(d[i]==d[node]-1)
 77                 {
 78                     int index=d[1]-d[node];
 79                     if(path[index]==0) path[index]=G[node][i];
 80                     else path[index]=min(path[index],G[node][i]);
 81
 82                     q.push(i);
 83                 }
 84     }
 85
 86     for(int i=0;i<d[1]-d[dst];i++)
 87         i==0? printf("%d",path[i]):printf(" %d",path[i]);
 88
 89 }
 90
 91
 92 int main()
 93 {
 94
 95     cin>>n;
 96     cin>>m;
 97
 98     //cout<<"m:"<<m<<" "<<"n:"<<n<<endl;
 99
100     init();
101
102     int j;
103     cin>>j;
104
105     bfs(j);
106
107     //printf("d1:%d d2:%d d3:%d d4:%d d5:%d\n",d[1],d[2],d[3],d[4],d[5]);
108
109     //printf("G[5][2]=%d G[5][1]=%d G[4][1]=%d G[2][1]=%d G[2][3]=%d G[1][3]=%d\n",G[5][2],G[5][1],G[4][1],G[2][1],G[2][3],G[1][3]);
110
111     p_bfs(j);
112
113
114     printf("\n");
115
116     return 0;
117 }

邻接表实现最短距离

  1 #include <iostream>
  2 #include <cstdio>
  3 #include <cstring>
  4 #include <queue>
  5 #include <vector>
  6 #include <algorithm>
  7
  8 using namespace std;
  9
 10 const int maxn=100000+10;
 11 const int inf=1000000;
 12 vector<int> v;
 13 int d[maxn];
 14 int vis[maxn];
 15 queue<int> q;
 16 vector<int> G[maxn];
 17 int m,n;
 18
 19 void init()
 20 {
 21     for(int i=1;i<=n;i++)
 22         G[i].clear();
 23
 24     for(int i=0;i<m;i++)
 25     {
 26         int l1,l2;
 27         cin>>l1>>l2;
 28
 29         //cout<<l1<<" "<<l2<<endl;
 30
 31         G[l1].push_back(l2);
 32         G[l2].push_back(l1);
 33     }
 34
 35     for(int i=1;i<=n;i++)
 36         cout<<G[i].size()<<" ";
 37
 38     cout<<endl;
 39 }
 40
 41 void bfs(int dst)
 42 {
 43     memset(d,inf,sizeof(d));
 44
 45     q.push(dst);
 46     vis[dst]=1;
 47     d[dst]=0;
 48
 49
 50     while(!q.empty())
 51     {
 52         int node=q.front();
 53         q.pop();
 54
 55         for(int i=0;i<G[node].size();i++)
 56             if(!vis[G[node][i]])
 57             {
 58                 d[G[node][i]]=d[node]+1;
 59
 60                 q.push(G[node][i]);
 61                 vis[G[node][i]]=1;
 62             }
 63     }
 64
 65 }
 66
 67
 68 void p_bfs(int dst)
 69 {
 70     memset(vis,0,sizeof(vis));
 71
 72     q.push(1);
 73
 74     printf("1");
 75     while(!q.empty())
 76     {
 77         int node=q.front();
 78         q.pop();
 79
 80         for(int i=0;i<G[node].size();i++)
 81             if(d[G[node][i]]==d[node]-1)
 82             {
 83                 printf(" %d",G[node][i]);
 84
 85                 q.push(G[node][i]);
 86
 87                 if(G[node][i]==dst) return;
 88
 89                 break;
 90             }
 91         }
 92 }
 93
 94
 95 int main()
 96 {
 97
 98     cin>>n;
 99     cin>>m;
100
101
103     init();
104
105     int j;
106     cin>>j;
107
108     bfs(j);
113
114     p_bfs(j);
115
116
117     printf("\n");
118
119     return 0;
120 }
时间: 2024-10-27 08:27:27

第六章部分例题 双向bfs邻接表和邻接矩阵实现的相关文章

《数据结构》C++代码 邻接表与邻接矩阵

       上一篇"BFS与DFS"写完,突然意识到这个可能偏离了"数据结构"的主题,所以回来介绍一下图的存储:邻接表和邻接矩阵.        存图有两种方式,邻接矩阵严格说就是一个bool型的二维数组,map[i][j]表示i到j有没有单向边,邻接表则是对1~N中每个点都拉出一个链表来,链表E[i]中存的每个点j都表示i到j有一条单向边. 这两种方式各有利弊,在稀疏图中,邻接表更好,省时间而且省空间:在稠密图中,邻接矩阵更好,不浪费时间的同时省去了指针域的空间

算法导论--图的存储(邻接表与邻接矩阵)

转载请注明出处:勿在浮沙筑高台http://blog.csdn.net/luoshixian099/article/details/51888031 图的存储方法有邻接表.邻近矩阵.邻接多重表.十字链表等.本篇文章介绍两种简单且比较常用的两种方法:邻接表与邻接矩阵方法. 以下面的无向图为例,介绍两种存储方法.有向图的存储方法类似,只是边是单方向,无向图的边可以看做双向. 1.邻接链表法 邻接链表表示法对图中的每个顶点建立一个带头的边链表:第i条链表代表依附于顶点vi所有边信息,若为有向图,则表示

POJ 2387 Til the Cows Come Home dijkstra算法 用邻接表和邻接矩阵

题目如下: Til the Cows Come Home Time Limit: 1000MS        Memory Limit: 65536K Total Submissions: 27726        Accepted: 9353 Description Bessie is out in the field and wants to get back to the barn to get as much sleep as possible before Farmer John wa

bfs 邻接表(需要优化 可能会RE *【模板】)

//---基于邻接表的bfs #include <stdio.h> #include <string.h> #include <iostream> #include <string> #include <algorithm> #include <queue> using namespace std; struct node { int date; struct node *next; }*head[101], *tail[101];

邻接表和邻接矩阵手写简洁代码DFS BFS

这是通过邻接矩阵进行DFS #include<iostream> #include<string> #include<windows.h> #define Max_ver_num 20 using namespace std ; bool visit[Max_ver_num] ;//这个数组的用途是标记 struct HGraph{ string vexs [ Max_ver_num ] ; //放每个顶点的数组的名字 int arcs [Max_ver_num][Ma

hpu 1713 参观城市 &lt;bfs+邻接表&gt;

1713: 参观城市 时间限制: 1 Sec  内存限制: 128 MB 提交: 35  解决: 20 [提交][状态][讨论版] 题目描述 有N个城市,这N个城市间只有N-1条路把这个N个城市连接起来.现在,小明在第S号城市,他有张该国地图,他想知道如果自己要去参观第T号城市,必须经过的前一个城市是几号城市(假设你不走重复的路). 输入 第一行输入一个整数M表示测试数据共有M(1<=M<=5)组 每组测试数据的第一行输入一个正整数N(1<=N<=100000)和一个正整数S(1&

图的邻接表和邻接矩阵 没写完放着。。

#include <iostream> #include <memory.h> #include <stack> #include <queue> using namespace std; class GraphList; //边结点的结构体 struct Edge { friend class GraphList; int VerAdj; //邻接顶点序号,从0开始编号 int cost; //边的权值 Edge*Link; //指向下一边节点的指针 Ed

邻接表转邻接矩阵

假设无向图G采用邻接矩阵存储,编写一个算法输出邻接表. Description 第一行为一个整数n,表示顶点的个数(顶点编号为0到n-1),接下来是为一个n*n大小的整数矩阵,表示图的邻接关系.数字为0表示不邻接,1表示邻接. Input 输出图G的邻接表.第一行表示顶点0可直接到达的顶点编号.其他行定义相同. Output 1 2 3 4 5 6 5 0 1 0 1 1 1 0 1 1 0 0 1 0 1 1 1 1 1 0 1 1 0 1 1 0 Sample Input 1 2 3 4 5

机试指南第六章-搜索-例题自解

枚举: 枚举是最简单也是最直白的搜索方式,它依次尝试搜索空间中所有的解,测试其是否符合条件,若符合则输出答案,否则继续测试下一组解. 例6.1 百鸡问题 #include<iostream> using namespace std; int main() { int n; while (cin >> n) { for (int x = 0; x <= 100; x++) { for (int y = 0; y <= 100 - x; y++) { int z = 100