kruskal最小生成树问题
来源:互联网 发布:sql delete多个表 编辑:程序博客网 时间:2024/06/05 02:35
/*
kruskal最小生成树问题
输入: 点的个数,边的个数 ,每条边的两端点及权值
#include<iostream>
using namespace std;
const int MAX=1000;
/*边
x,y两端点
weight权值
*/
struct graphNode{
int x,y;
int weight;
};
//点数组
int vertex[MAX];
//边数组
struct graphNode edgeNode[MAX];
//最小生成树数组
struct graphNode minTree[MAX];
//点个数
int vertexCount=0;
//边个数
int edgeCount=0;
//输入点,边
void createAdjacency(int vertexCount,int edgeCount){
int x,y,weight;
for(int k=1;k<=vertexCount;++k){
vertex[k]=0;
}
//输入边的两端点及权值,无向图仅输入一次
for(int i=1;i<=edgeCount;++i){
x=0;
y=0;
weight=0;
cin>>x>>y>>weight;
edgeNode[i].x=x;
edgeNode[i].y=y;
edgeNode[i].weight=weight;
}
}
//把边的结构体数组排序
void bubble_sort(){
for(int i=edgeCount;i>0;--i){
for(int j=1;j<i;++j){
if(edgeNode[j].weight>edgeNode[j+1].weight){
struct graphNode temp=edgeNode[j];
edgeNode[j]=edgeNode[j+1];
edgeNode[j+1]=temp;
}
}
}
}
//构成最小生成树
void gameover(){
int k=1;
//一维数组点的值level不同,代表不同的集合树,0代表未在生成树中
int level=1;
minTree[k++]=edgeNode[1];
vertex[edgeNode[1].x]=1;
vertex[edgeNode[1].y]=1;
for(int i=2;i<=edgeCount;++i){
if(vertex[edgeNode[i].x]==0 && vertex[edgeNode[i].y]==0){
vertex[edgeNode[i].x]=++level;
vertex[edgeNode[i].y]=level;
}else if(vertex[edgeNode[i].x]==vertex[edgeNode[i].y]){
continue;
}else if(vertex[edgeNode[i].x]==0){
vertex[edgeNode[i].x]=vertex[edgeNode[i].y];
}else if(vertex[edgeNode[i].y]==0){
vertex[edgeNode[i].y]=vertex[edgeNode[i].x];
}else if(vertex[edgeNode[i].x]!=vertex[edgeNode[i].y]){
for(int m=1;m<vertexCount;++m){
if(vertex[m]==vertex[edgeNode[i].y])
vertex[m]=vertex[edgeNode[i].x];
}
vertex[edgeNode[i].y]=vertex[edgeNode[i].x];
}
minTree[k++]=edgeNode[i];
if(k==vertexCount)break;
}
}
void print(int n){
for(int i=1;i<n;++i){
cout<<"minTree[i].x="<<minTree[i].x <<" minTree[i].y="<<minTree[i].y<<" minTree[i].weight="<<minTree[i].weight<<endl;
}
}
int main(){
//输入点的个数,边的个数
cin>>vertexCount>>edgeCount;
createAdjacency(vertexCount,edgeCount);
bubble_sort();
gameover();
print(vertexCount);
return 0;
}
kruskal最小生成树问题
输入: 点的个数,边的个数 ,每条边的两端点及权值
输出: 最小生成树的边,两端点及权值
提示:没经过大量测试,如有错误请指出,感激不尽!
*/#include<iostream>
using namespace std;
const int MAX=1000;
/*边
x,y两端点
weight权值
*/
struct graphNode{
int x,y;
int weight;
};
//点数组
int vertex[MAX];
//边数组
struct graphNode edgeNode[MAX];
//最小生成树数组
struct graphNode minTree[MAX];
//点个数
int vertexCount=0;
//边个数
int edgeCount=0;
//输入点,边
void createAdjacency(int vertexCount,int edgeCount){
int x,y,weight;
for(int k=1;k<=vertexCount;++k){
vertex[k]=0;
}
//输入边的两端点及权值,无向图仅输入一次
for(int i=1;i<=edgeCount;++i){
x=0;
y=0;
weight=0;
cin>>x>>y>>weight;
edgeNode[i].x=x;
edgeNode[i].y=y;
edgeNode[i].weight=weight;
}
}
//把边的结构体数组排序
void bubble_sort(){
for(int i=edgeCount;i>0;--i){
for(int j=1;j<i;++j){
if(edgeNode[j].weight>edgeNode[j+1].weight){
struct graphNode temp=edgeNode[j];
edgeNode[j]=edgeNode[j+1];
edgeNode[j+1]=temp;
}
}
}
}
//构成最小生成树
void gameover(){
int k=1;
//一维数组点的值level不同,代表不同的集合树,0代表未在生成树中
int level=1;
minTree[k++]=edgeNode[1];
vertex[edgeNode[1].x]=1;
vertex[edgeNode[1].y]=1;
for(int i=2;i<=edgeCount;++i){
if(vertex[edgeNode[i].x]==0 && vertex[edgeNode[i].y]==0){
vertex[edgeNode[i].x]=++level;
vertex[edgeNode[i].y]=level;
}else if(vertex[edgeNode[i].x]==vertex[edgeNode[i].y]){
continue;
}else if(vertex[edgeNode[i].x]==0){
vertex[edgeNode[i].x]=vertex[edgeNode[i].y];
}else if(vertex[edgeNode[i].y]==0){
vertex[edgeNode[i].y]=vertex[edgeNode[i].x];
}else if(vertex[edgeNode[i].x]!=vertex[edgeNode[i].y]){
for(int m=1;m<vertexCount;++m){
if(vertex[m]==vertex[edgeNode[i].y])
vertex[m]=vertex[edgeNode[i].x];
}
vertex[edgeNode[i].y]=vertex[edgeNode[i].x];
}
minTree[k++]=edgeNode[i];
if(k==vertexCount)break;
}
}
void print(int n){
for(int i=1;i<n;++i){
cout<<"minTree[i].x="<<minTree[i].x <<" minTree[i].y="<<minTree[i].y<<" minTree[i].weight="<<minTree[i].weight<<endl;
}
}
int main(){
//输入点的个数,边的个数
cin>>vertexCount>>edgeCount;
createAdjacency(vertexCount,edgeCount);
bubble_sort();
gameover();
print(vertexCount);
return 0;
}
0 0
- kruskal最小生成树问题
- 最小生成树问题(Kruskal算法)
- 最小生成树Kruskal
- kruskal 最小生成树
- 最小生成树 kruskal
- kruskal 最小生成树
- 最小生成树-Kruskal
- 最小生成树kruskal
- 最小生成树---Kruskal
- Kruskal 最小生成树
- 最小生成树 Kruskal
- 最小生成树--Kruskal
- Kruskal 最小生成树
- 最小生成树-Kruskal
- 最小生成树Kruskal
- Kruskal 最小生成树
- kruskal最小生成树
- 最小生成树-Kruskal
- Java基础-线程的通信
- FILE结构体(文件描述符及缓冲区)
- CTreeCtrl使用演示
- 数学实验:Matlab代码 用动画展示一拱摆线的构造过程
- matlab-模糊控制-WM算法
- kruskal最小生成树问题
- 斐波那契通项公式
- 【PHP系列】PHP组件详解
- Git使用教程
- 《数据压缩》实验报告三·Huffman编解码算法实现与压缩效率分析
- Oracle基本操作九:流程控制(分支控制与循环控制)
- Java异或进行文件加密
- 【CNMP系列】CentOS7.0下安装FTP服务
- go语言学习笔记-接口学习