图的邻接链表

来源:互联网 发布:澳门mac口红专柜价格 编辑:程序博客网 时间:2024/05/16 09:59
//邻接链表/******************     **********************************               ****/#include <vector>#include <iostream>#include <queue>#define maxnum 50using namespace std;struct Edge{int end;//边的顶点位置int weight;//边的权重Edge * next;//指向下一条边};struct Vertex{char data;Edge * first;};struct graphList{Vertex vertex[maxnum];int vertexNum,edgeNum;};void buildGraphList(graphList & graph){cout<<"创建邻接表图:"<<endl;cout<<"输入图的顶点个数和边个数: "<<ends;cin >>graph.vertexNum>>graph.edgeNum;//初始化顶点信息cout<<"输入顶点信息: "<<ends;for (int i=0;i<graph.vertexNum;++i){cin >> graph.vertex[i].data;graph.vertex[i].first=NULL;}//初始化边的信息int m,n,weight;cout<<"输入边的信息,两个端点和权值:"<<ends;for (int i=0;i<graph.edgeNum;++i){cin >>m>>n>>weight;m--;n--;Edge * temp = new Edge;temp->end = n;temp->weight = weight;temp->next = graph.vertex[m].first;graph.vertex[m].first = temp;Edge * temp2 = new Edge;temp2->end = m;temp2->weight = weight;temp2->next = graph.vertex[n].first;graph.vertex[n].first= temp2;}}//链表的销毁void deleteGraphList(graphList & graph){for (int i=0;i<graph.vertexNum;++i){Edge * temp1 = graph.vertex[i].first,*temp2;while(temp1){temp2 = temp1->next;delete temp1;temp1 = temp2;}}}//邻接表的深度优先搜索void dfs_drive(graphList & graph,vector<int> & visited,int pos){if (!visited[pos]){visited[pos]=1;cout<<graph.vertex[pos].data<<ends;for (int i=0;i<graph.vertexNum;++i){if (!visited[i]){dfs_drive(graph,visited,i);}}}}void dfs(graphList & graph){cout<<"邻接表的深度优先搜索:"<<endl;vector<int> visited(graph.vertexNum);cout<<"选择遍历的起始顶点:"<<ends;int start;cin >> start;start--;dfs_drive(graph,visited,start);cout<<endl;}//邻接表的广度优先遍历void bfs(graphList & graph){cout<<"邻接表的广度优先遍历:"<<endl;cout<<"选择遍历的起点:"<<ends;int start;cin >> start;start--;vector<int> visited(graph.vertexNum);queue<int> que;que.push(start);visited[start]=1;cout<<graph.vertex[start].data<<ends;while(que.size()){int pos = que.front();que.pop();Edge * temp = graph.vertex[pos].first;while(temp){if (!visited[temp->end]){visited[temp->end] =1;cout<<graph.vertex[temp->end].data<<ends;que.push(temp->end);}temp = temp->next;}}cout<<endl;}//最小生成树----kruskal算法struct EDGE {int first,end;int weight;};void kruskal(graphList & graph){int num = graph.edgeNum;vector<EDGE> edge(num);// 初始化边int k=0,num2= graph.vertexNum,j=0;while(k < num2){Edge * temp = graph.vertex[k].first;while(temp){if (temp->end > k){edge[j].first=k;edge[j].end = temp->end;edge[j].weight = temp->weight;++j;}temp =temp->next;}++k;}//对边按照权重大小进行排序for (int i=0;i<num;++i){for (int j=0;j<num-1-i;++j){if (edge[j].weight>edge[j+1].weight){int temp = edge[j].weight;edge[j].weight = edge[j+1].weight;edge[j+1].weight = temp;temp = edge[j].first;edge[j].first = edge[j+1].first;edge[j+1].first = temp;temp = edge[j].end;edge[j].end = edge[j+1].end;edge[j+1].end = temp;}}}//判断是否形成环---确定每个顶点所能访问的最远的结点vector<int> last(num2);//初始化--一个个离散点for (int i=0;i<num2;++i)last[i] = i;//更新---不能形成闭环for(int i=0;i<num;++i){EDGE temp= edge[i];int  n1 = temp.first,n2=temp.end;if (last[n1] == last[n2]){continue;}cout<<"加入以"<<temp.first+1<<"和"<<temp.end+1<<"为端点的边,其权重为"<<temp.weight<<endl;//last[temp.first] = last[temp.end];//若两个顶点连通,则这两个顶点连通的最远的顶点应该连通while(last[n1]!=n1)n1 = last[n1];while(last[n2]!=n2)n2 = last[n2];if (n1>n2)last[n2] =n1;else last[n1] =n2;//last[temp.end] = 1;}}

0 0
原创粉丝点击