码迷,mamicode.com
首页 > 其他好文 > 详细

6.0图

时间:2020-03-05 16:41:38      阅读:65      评论:0      收藏:0      [点我收藏+]

标签:enum   开始   rev   入队   dijkstra   编号   queue   表示   ==   

图的建立(邻接表),含BFS和Dijkstra算法。

 

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<vector>
 4 #include<queue> 
 5 #include<algorithm>
 6 #define inf 0x3f3f3f3f
 7 typedef enum{undiscovered,discovered,visited}Vstatus; 
 8 using namespace std;
 9 struct Vertex{
10     int data;
11     //int indegree,outdegree;
12     Vstatus status;
13     Vertex(int d=0):data(d),status(undiscovered){}
14 };
15 struct Edge{
16     int weight;
17     int nextPos;//关联顶点,即这条边的末端
18           //那么起始端呢?用Gragh类的边集合的下标表示 
19     Edge(){}
20 };
21 struct Gragh{
22     vector<Vertex> V;
23     vector<vector<Edge> > E;//好像不用列表也行 
24     //创建顶点的同时也要创建对应的边 
25     Gragh(){}
26     
27     void BFS(int m){//编号为m的节点开始搜索
28     queue<int> Q;
29     Q.push(m);//入队,入队之后就是被发现 
30     V[m].status=discovered;
31     while(!Q.empty()) {// 这个循环作用是,当队列不空,取出队首元素 
32         int v=Q.front();//找到队首元素 
33         Q.pop();//队首元素出队 
34         for(int i=0;i<E[v].size();i++) {// 这个循环作用是,遍历队首元素的所有邻居,使邻居们入队(被发现)
35             if(V[E[v][i].nextPos].status==undiscovered) {
36                 Q.push(E[v][i].nextPos);
37                 V[E[v][i].nextPos].status=discovered;
38             }
39         }
40         //至此,队首v的邻居们都入队了
41         //v的状态可改成被访问
42         V[v].status=visited; 
43     }    
44     } 
45     void Dijkstra(int s){
46         int N=V.size();
47         int dist[N];
48         int prev[N];
49         fill(dist,dist+N,inf);
50         dist[s]=0;
51         fill(prev,prev+N,-1);
52         int visited[V.size()]={0};
53         
54         for(int i=0;i<N;i++)
55         {
56             int u;int min=inf;
57             for(int j=0;j<N;j++){
58                 if(visited[j]==0&&dist[j]<min)
59                 {
60                     u=j;
61                     min=dist[j];
62                 }
63             }
64             visited[u]=1;
65             for(int j=0;j<E[u].size();j++){
66                 int v=E[u][j].nextPos;
67                 if(visited[v]==0&&dist[u]+E[u][j].weight<dist[v]){
68                     dist[v]=dist[u]+E[u][j].weight;
69                     prev[v]=u;
70                 }
71             }
72             
73         }
74     }
75     
76     
77     
78 };
79  
80 int main(){  
81    
82     
83 return 0;
84 }

 

6.0图

标签:enum   开始   rev   入队   dijkstra   编号   queue   表示   ==   

原文地址:https://www.cnblogs.com/wsshub/p/12420976.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!