⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 克鲁斯卡尔算法思想.cpp

📁 按克鲁斯卡尔(Kruskal)算法思想
💻 CPP
字号:
#include<iostream.h>
struct v
{int data;
v *next;
v *parent;
int use;
};
struct edge
{v init;
v end;
int weight;
int use;//如果为0没有用过或是没有作废;如果为1就是用过或是作废的边。
};
void storepicture(edge *(&a),int n,v *b,int m)
{cout<<"输入结点:"<<endl;
for(int j=0;j<m;j++){cout<<"输入第"<<j+1<<"个顶点"<<endl;cin>>b[j].data;b[j].next=NULL;b[j].parent=NULL;}
cout<<"请由大到小输入每一条边:"<<endl;
for (int i=0;i<n;i++) { cout<<"输入第"<<i+1<<"条边"<<endl;
cout<<"输入起点:"<<endl;
cin>>a[i].init.data;
cout<<"输入终点:"<<endl;
cin>>a[i].end.data;
cout<<"输入权值:"<<endl;
cin>>a[i].weight;
a[i].use=0;
}}
void searchandjoin(edge *(&a1),int k)//a1是图边集头指针,a2是最小生成树边集的头指针,k为所要删的边
//i2为最小生成树边集边数,j1图顶点数,j2为最小生成树的顶点数;
{

v *pt;
v p=a1[k].init;
for(;(p.parent==NULL)||(p.data==(a1[k].end.data));p=*(p.parent)) ; 
if(p.data==(a1[k].end.data)) ;
else {
	for(p=a1[k].init;p.next==NULL||p.data==a1[k].end.data;p=*(p.next)) ; 
	if(p.data==a1[k].end.data) ;
	else
	{pt=a1[k].init.next; 
     a1[k].init.use=1;
	 a1[k].end.use=1;
	a1[k].init.next=&(a1[k].end);
	a1[k].end.next=pt;
     cout<<"("<<a1[k].init.data<<","<<a1[k].end.data<<")"<<endl;
	}
	
}
a1[k].use=1;
}
void bubble(edge *(&a),int size)
{int i,work;
edge temp;
for(int pass=1;pass<size;pass++)
{work=1;
for (i=0;i<size-pass;i++)
if(a[i].weight<a[i+1].weight)
{temp=a[i];
a[i]=a[i+1];
a[i+1]=temp;
work=0;
}
if(work) break;
}
}
int seekedge(edge *(&a),int n)
{edge pt=a[n-1];
int k=n-1;
	for(;pt.use!=0||k<0;pt=a[k]) k--;
if(k!=0)	return k;
else 
return 0;
}
void main()
{int n,m;
cout<<"请输入图的边数:"<<endl;
cin>>n;
cout<<"请输入图的顶点数:"<<endl;
cin>>m;	
edge *pp=new edge[n];
v *dd=new v[m];	
storepicture(pp,n,dd,m);
bubble(pp,n);
int ff=n-1;
while (ff!=0)
{
searchandjoin(pp,ff);
ff=seekedge(pp,n);
}
v *pt;
if(pp[0].end.use!=1&&pp[0].init.use==1)
	{pt=pp[0].init.next;
	pp[0].end.use=1;
	pp[0].init.next=&(pp[0].end);
	pp[0].end.next=pt;
     cout<<"("<<pp[0].init.data<<","<<pp[0].end.data<<")"<<endl;
	}
if(pp[0].init.use!=1&&pp[0].end.use==1)
{pt=pp[0].end.next;
	pp[0].init.use=1;
	pp[0].end.next=&(pp[0].end);
	pp[0].init.next=pt;
     cout<<"("<<pp[0].init.data<<","<<pp[0].end.data<<")"<<endl;
	
	}
else cout<<"最小生成树已建成"<<endl;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -