//图的邻接矩阵实现
//广度遍历bfs和深度遍历dfs
//构造最小生成树的prim、kruskal算法
#include <iostream>
#include<stack>
#include<queue>
#define WEIGHTMAX 100
#define VERTEXMAX 50
#define VISITED 1
#define UNVISITED 0
using namespace std;
class ufset //等价类
{
private:
int n; //个数
int *root,*next,*length; //等价类代表元、下一个元素、该元素所在等价类的元素个数
public:
friend class graph;
ufset(int s) //初始时均各自为等价类
{
root=new int[s];
next=new int[s];
length=new int[s];
n=s;
for(int i=0;i<s;i++)
{
root[i]=next[i]=i;
length[i]=1;
}
}
~ufset()
{
delete [] root;
delete [] next;
delete [] length;
}
void show() //输出
{
cout<<"root:"<<endl;
for(int i=0;i<n;i++)
{
cout<<root[i]<<" ";
}
cout<<endl;
cout<<"next:"<<endl;
for(int i=0;i<n;i++)
{
cout<<next[i]<<" ";
}
cout<<endl;
cout<<"length:"<<endl;
for(int i=0;i<n;i++)
{
cout<<length[i]<<" ";
}
cout<<endl;
}
void Union(int u,int v) //两个等价类的合并
{
if(length[root[u]]<length[root[v]])
{
int temp=u;
u=v;
v=temp;
}
if(root[u]==root[v]) return;
int p=next[root[u]]; //next
next[root[u]]=next[root[v]];
next[root[v]]=p;
length[root[v]]=1; //length
length[root[u]]++;
int oldroot=root[v]; //root
for(int i=0;i<n;i++)
if(root[i]==oldroot)
root[i]=root[u];
}
bool unionOK(int u,int v) //两个元素是否在同一个等价类中
{
if(root[v]==root[u])
return true;
else
return false;
}
};
class edge //边类(数据公开)
{
public:
int start,end;
int weight;
friend class graph;
edge(){};
edge(int w)
{
weight=w;
}
edge(int s,int e,int w)
{
start=s;
end=e;
weight=w;
}
};
void visit(int v)
{
cout<<v<<"
(c++)数据结构与算法之图:邻接矩阵、深度广度遍历、构造最小生成树(prim、kruskal算法)
最新推荐文章于 2024-07-26 22:15:51 发布
本文介绍了如何使用C++实现图的邻接矩阵、深度优先遍历(DFS)、广度优先遍历(BFS)以及构造最小生成树的Prim和Kruskal算法。示例代码中包含图的邻接矩阵表示,以及图的遍历和最小生成树构建的详细步骤。
摘要由CSDN通过智能技术生成