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

📄 tin.txt

📁 一种更简单
💻 TXT
字号:
最小生成树算法 (C++实现)2007-01-27 18:51这个算法,不考虑点,只考虑边及权值,抛弃了以往的邻接矩阵,邻接链表等方式 ,而是直接用数组存储,节省空间,效率更高.

//=======================
//优化后的最小生成树算法
//=======================
#include <iostream>
#include <algorithm>
using namespace std;
//=======================
//边的结构体的定义
//-----------------------
struct Line
{
int begin;//边的开始点
int end;//边的结束点
double value;//线的权值
};
//=======================
//建堆时用的仿函数
//-----------------------
struct heap_f
{
bool operator()(Line a,Line b) const
{
   return a.value>b.value;
}
};
//===============================
//分区时用的仿函数,并判断有无回路
//-------------------------------
struct partition_f
{
int *pi;//用来存储边的开始点
partition_f(int n)
{
   pi = (int *)malloc(sizeof(int)*n);
   memset(pi,0,n);//将pi初始化为0
}
bool hasLoop(Line * line)//判断有无回路
{
   if(pi[line->begin]==1&&pi[line->end]==1)
    return true;
   else
   {
    pi[line->begin]=1;
    pi[line->end]=1;
    return false;
   }
}
bool operator()(Line line) const
{
   return( pi[line.begin]==1||pi[line.end]==1)&&!(pi[line.begin]==1&&pi[line.end]==1);
}
};
//================================
//主函数
//--------------------------------
int main()
{
int pointNum;//表示点的个数
int lineNum;   //表示边的个数
Line *posBegin,*posEnd;//表示边的开始位置和结束位置

cin>>pointNum>>lineNum;//读入点的个数和边的个数

Line *lineSet = (Line *)malloc(sizeof(Line)*lineNum);//定义动态的数组

int i =0;
while(cin>>lineSet[i].begin>>lineSet[i].end>>lineSet[i].value)++i; //从文件中读入数据(边)到数组里

partition_f pf(lineNum+1);//0下标空闲不用
pf.pi[1]=1;
posBegin =lineSet;
while(posBegin-lineSet<pointNum-1)
{
   posEnd = partition(posBegin,lineSet+lineNum,pf);//将数组分区
   make_heap(posBegin,posEnd,heap_f());//将第一区建堆
   if(!pf.hasLoop(posBegin))//确定没有回路
   {
       ++posBegin;
   }
}
for(Line * li = lineSet;li!=posBegin;++li)//输出最小生成树的各个边
   cout<<"("<<li->begin<<"   "<<li->end<<"   "<<li->value<<")"<<endl;
}
//================================

输入数据:(放到.txt文件里)

9 14
1 2 4
2 3 8
3 4 7
4 5 9
5 6 10
4 6 14
3 6 4
7 6 2
7 8 1
8 9 7
3 9 2
2 8 11
1 8 8
7 9 6

输出结果:

(1 2 4)
(2 3 8)
(3 9 2)
(3 6 4)
(7 6 2)
(7 8 1)
(3 4 7)
(4 5 9)

 

⌨️ 快捷键说明

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