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

Posted lan126

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了第六章部分例题 双向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 }

 

以上是关于第六章部分例题 双向bfs邻接表和邻接矩阵实现的主要内容,如果未能解决你的问题,请参考以下文章

第六章学习小结

数据结构:第六章学习小结

第六章 图(b1)邻接矩阵

第六章学习小结

第六章学习小结

图的遍历方法——DFS和BFS