#include <fstream>
using namespace std
class edgeset{
public:
int from//边起始点
int end//边终止点
int w//边的权值
}//定义一个类用来存放图的边的信息(kruskal算法中用到)
//==============prim算法=============================
void prim(int a[11][11],int (&path)[11][11]){
cout<<"运用prim算法"<<endl
int i,j,k
int mini,minj,min,sum=0
a[0][0]=-1
cout<<"通道铺设情况:(0-10分别对应点a-k)"<<endl
for(k=1k<11k++){
min=100
for(i=0i<11i++){
for(j=0j<11j++){
if(a[i][i]+a[j][j]==-1 &&a[i][j]>0 &&a[i][j]<min){
min=a[i][j]
mini=i
minj=j
}
}
}
if(a[mini][mini]==-1){
cout<<"("<<mini<<","<<minj<<")"
path[mini][minj]=a[mini][minj]
path[minj][mini]=a[mini][minj]
a[minj][minj]=-1
}
else{
cout<<"("<<mini<<","<<minj<<")"
path[mini][minj]=a[mini][minj]
a[mini][mini]=-1
path[minj][mini]=a[mini][minj]
}
sum=sum+min
}
cout<<endl
cout<<"建设费用为:"<<sum<<endl
//=============最小生成树的邻接矩阵输出==============
cout<<"最小生成树对应的邻接矩阵为:"<<endl
for(int x=0x<11x++){
for(int y=0y<11y++){
cout<<path[x][y]<<" "
}
cout<<endl
}
}
//===================================================
//===========kruskal算法=============================
void kruskal(int a[11][11],int(&kpath)[11][11]){
cout<<"运用kruskal算法"<<endl
int i,j,k,d
int num=0
edgeset edge[18]
//将邻接矩阵中权值大于1的边对应的点及权值存到一个边类
for(i=0i<11i++){
for(j=i+1j<11j++){
if(!a[i][j]==0){
edge[num].from=i
edge[num].end=j
edge[num].w=a[i][j]
num++
}
}
}
edgeset tmp
//===================================================
//=======将边按权值大小排序==========================
for(i=1i<18i++){
for(j=0j<18-ij++){
if(edge[j].w>edge[j+1].w){
tmp=edge[j]
edge[j]=edge[j+1]
edge[j+1]=tmp
}
}
}
//===================================================
int m1,m2
edgeset c[11]
int s[11][11]
for(i=0i<11i++)
for(j=0j<11j++){
if(i==j)
s[i][j]=1
else
s[i][j]=0
}
k=1
d=0
int sum=0
cout<<"通道铺设情况:(0-10分别对应点a-k)"<<endl
while(k<11){
for(i=0i<11i++){
if(s[i][edge[d].from]==1)
m1=i
if(s[i][edge[d].end]==1)
m2=i
}
if(m1!=m2){
c[k-1]=edge[d]
cout<<"("<<c[k-1].from<<","<<c[k-1].end<<")"
kpath[c[k-1].from][c[k-1].end]=c[k-1].w
kpath[c[k-1].end][c[k-1].from]=c[k-1].w
sum=sum+c[k-1].w
k++
for(j=0j<11j++){
if(s[m2][j]!=0){
s[m1][j]=s[m2][j]
s[m2][j]=0
}
}
}
d++
}
cout<<endl
cout<<"建设费用为:"<<sum<<endl
//=============最小生成树的邻接矩阵输出==============
cout<<"最小生成树对应的邻接矩阵为:"<<endl
for(int x=0x<11x++){
for(int y=0y<11y++){
cout<<kpath[x][y]<<" "
}
cout<<endl
}
}
void main(){
int h,z
int a[11][11]
int path[11][11]={0}
//==============数据读入(图的邻接矩阵)=============
ifstream in("picture.txt")
for(h=0h<11h++){
for(z=0z<11z++){
in>>a[h][z]
}
}
//===================================================
cout<<"图的邻接矩阵:"<<endl
for(int i=0i<11i++){
for(int j=0j<11j++){
cout<<a[i][j]<<" "
}
cout<<endl
}
int kpath[11][11]={0}
int b[11][11]
ifstream in2("picture.txt")
for(h=0h<11h++){
for(z=0z<11z++){
in2>>b[h][z]
}
}
int ch
cout<<"请选择算法(1:prim算法/2:kruskal算法):"
cin>>ch
cout<<endl
switch(ch){
case 1:prim(a,path)//调用prim算法函数
break
case 2:kruskal(b,kpath)
break
}
}
//希望对你有所帮助
树和图是两种常见的数据结构,在计算机技术应用十分广泛,他们也是两种思考问题的方式,常用于结局实际问题。树最直观的用途就是如人类社会的族谱和各种社会组织机构都可用树形象表示。树在计算机领域中也得到广泛应用,如在编译源程序如下时,可用树表示源源程序如下的语法结构。在数据库系统中,树型结构也是信息的重要组织形式之一,一切具有层次关系的问题都可用树来描述。数据结构的图就是实际情况的抽象,即逻辑模型,然后通过计算机编程来解决问题。比如一个很复杂的地图,有很多城市,有很多路,如何找出最短路径呢?当然是用计算机来算了,你就得用图来表示等等,很多用途,如果你学习数学建模,你会经常遇到他们的好好学吧#include <iostream>#include<string.h>
#include<stack>
#include<queue>
const int Max=100
const int VISITED=101010
const int UNVISITED=111111
const int AFFINITY=101010
const int INFINITY=111111
using namespace std
class Edge
{
public:
int start
int end
int weight
Edge(int st=0,int en=0,int w=0):start(st),end(en),weight(w){}
bool operator>(Edge oneEdge){return weight>oneEdge.weight?true:false}
bool operator<(Edge oneEdge){return weight<oneEdge.weight?true:false}
bool operator!=(Edge oneEdge)
{
if(weight!=oneEdge.weight||start!=oneEdge.start||end!=oneEdge.end)
return true
return false
}
}
class AdjGraf
{
private:
int verticesNum
int edgeNum
int **matrix
int *Mark
public:
AdjGraf(int vert)
{
int i=0,j=0
verticesNum=vert
matrix=(int**)new int*[vert]
for(i=0i<verti++)
matrix[i]=new int[vert]
Mark=new int[vert]
for(i=0i<verti++)
for(j=0j<vertj++)
{
matrix[i][j]=0
}
for( int m=0m<verticesNumm++)
Mark[m]=UNVISITED
}
~AdjGraf()
//返回与顶点oneVertex相关联的第一条边
Edge FirstEdge(int oneVertex)
//返回与边PreEdge有相同关联顶点oneVertex的下一条边
Edge NextEdge( Edge preEdge)
//添加一条边
void setEdge(int fromVertex,int toVertex,int weight)
//删一条边
void delEdge(int fromVertex,int toVertex)
//如果oneEdge是边则返回TRUE,否则返回FALSE
bool IsEdge( Edge oneEdge)
{
if(oneEdge.start>=0&&oneEdge.start<verticesNum&&
oneEdge.end>=0&&oneEdge.end<verticesNum)
return true
else return false
}
//返回边oneEdge的始点
int FromVertex(Edge oneEdge){return oneEdge.start}
//返回边oneEdge的终点
int ToVertex(Edge oneEdge){return oneEdge.end}
//返回边oneEdge的权
int Weight(Edge oneEdge){return oneEdge.weight}
void visit(int i){cout<<i+1<<" "}
void BFS(int i=1)
void DFS(int i)
void DFSTraverse(int v)
void DFSNoReverse(int f=1)
Edge UNVISITEDEdge(int f)
}
AdjGraf::~AdjGraf()
{
for(int i=0i<verticesNumi++)
delete[]matrix[i]
delete[]matrix
}
Edge AdjGraf::FirstEdge(int oneVertex)
{int i
Edge tempEdge
tempEdge.start=oneVertex
for( i=0i<verticesNumi++)
if(matrix[oneVertex][i]!=0)
break
tempEdge.end=i
tempEdge.weight=matrix[oneVertex][i]
return tempEdge
}
Edge AdjGraf ::NextEdge( Edge preEdge)
{
Edge tempEdge
tempEdge.start=preEdge.start
int i=0
for(i=preEdge.end+1i<verticesNumi++)
if(matrix[preEdge.start][i]!=0)
break
tempEdge.end=i
tempEdge.weight=matrix[preEdge.start][i]
return tempEdge
}
void AdjGraf::setEdge(int fromVertex,int toVertex,int weight)
{
if(matrix[fromVertex-1][toVertex-1]==0)
edgeNum++
matrix[fromVertex-1][toVertex-1]=weight
}
void AdjGraf::delEdge(int fromVertex,int toVertex)
{
if(matrix[fromVertex][toVertex]==0)
edgeNum--
matrix[fromVertex][toVertex]=0
}
/*************递归实现深度优先****************/
void AdjGraf::DFS(int i)
{
visit(i)
Mark[i]=VISITED
for(Edge e=FirstEdge(i)IsEdge(e)e=NextEdge(e))
if(Mark[ToVertex(e)] == UNVISITED)
DFS(ToVertex(e))
}
void AdjGraf::DFSTraverse(int v)
{
v--
int i
for(i=0i<verticesNumi++)
Mark[i]=UNVISITED
for(i=vi<v+verticesNumi++)
if (Mark[i]== UNVISITED)
DFS(i)
}
Edge AdjGraf::UNVISITEDEdge(int f)
{ int i
for( Edge e=FirstEdge(f)IsEdge(e)e=NextEdge(e))
if(Mark[e.end]==UNVISITED)
return e
return Edge(verticesNum,verticesNum,0)
}
/*************非递归实现深度优先**************/
void AdjGraf::DFSNoReverse(int f)
{
f--
int i,counter=0,j,flag
stack<int>Temp
for(i=0i<verticesNumi++)
Mark[i]=UNVISITED
flag=f
while(counter<12)
{
while(flag!=verticesNum&&IsEdge(UNVISITEDEdge(flag))||!Temp.empty())
{
// Edge tempEdge=UNVISITEDEdge(j)
while(flag!=verticesNum&&Mark[flag]==UNVISITED)
{
visit(flag)
Mark[flag]=VISITED
Temp.push(flag)
flag=UNVISITEDEdge(flag).end
}
if(!Temp.empty())
{
flag=UNVISITEDEdge(Temp.top()).end
Temp.pop()
}
}
if(Mark[counter]==UNVISITED) flag=counter
else counter++
}
}
/*************非递归实现广度优先**************/
void AdjGraf::BFS(int v)
{
int i
v--
for( i=0i<verticesNumi++)
Mark[i]=UNVISITED
queue<int>tempqueue
i=0
/*********v先从指定位置开始,然后从v=0,1,2......
依次检查是否有孤立结点*****************/
while(i<verticesNum)
{
tempqueue.push(v)
while(!tempqueue.empty())
{
v=tempqueue.front()
tempqueue.pop()
if(Mark[v]==UNVISITED)
{
visit(v)
Mark[v]=VISITED
for(Edge e=FirstEdge(v)IsEdge(e)e=NextEdge(e))
{
v=ToVertex(e)
tempqueue.push(v)
}
}
}
/***********防止出现孤立点****************/
if(Mark[i]==VISITED) i++
else v=i
}
}
int main()
{
AdjGraf Graph(12)
Graph.setEdge(1,2,1)
Graph.setEdge(2,1,1)
Graph.setEdge(1,3,5)
Graph.setEdge(3,1,5)/** V1 V12 V11*/
Graph.setEdge(2,4,3)/** /\ / \ */
Graph.setEdge(4,2,3)/** v2v3 V10 V9 */
Graph.setEdge(2,5,7)/** / \ / \ */
Graph.setEdge(5,2,7)/**v4 v5v6-v7 */
Graph.setEdge(4,8,4)/** \ / */
Graph.setEdge(8,4,4)/** v8 */
Graph.setEdge(5,8,3)
Graph.setEdge(8,5,3)
Graph.setEdge(3,6,2)
Graph.setEdge(6,3,2)
Graph.setEdge(3,7,1)
Graph.setEdge(7,3,1)
Graph.setEdge(6,7,6)
Graph.setEdge(7,6,6)
Graph.setEdge(12,9,6)
Graph.setEdge(9,12,6)
Graph.setEdge(12,10,6)
Graph.setEdge(10,12,6)
Graph.setEdge(11,11,6)
cout<<"DFSTraverse:"<<endl
Graph.DFSTraverse(3)
cout<<endl
cout<<"DFSNoReverse:"<<endl
Graph.DFSNoReverse(3)
cout<<endl
cout<<"BFS:"<<endl
Graph.BFS(3)
cout<<endl
return 0
}
以上代码运行环境codeblocks 程序采用DFS递归算法 DFS非递归算法 BFS非递归算法
望采纳~