标签: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 }
标签:enum 开始 rev 入队 dijkstra 编号 queue 表示 ==
原文地址:https://www.cnblogs.com/wsshub/p/12420976.html