Prim 算法

// ------------------------Prim()-----------------------------

/*

最小生成树算法

从Prim_in.txt文件中读入数据,将结果输出到Prim_out.txt中

输入格式:(以邻接矩阵为存储结构)

6

0 5 6 4 7 8

1 0 2 5 8 7

4 1 0 3 5 8

1 4 7 0 2 9

2 5 4 1 0 6

8 5 7 4 6 0

 

输出格式:

234     为最小生成树的边的权值之和

*/

#include<fstream>
#define MaxNum 765432100;
using namespace std;


ifstream fin("Prim_in.txt");//                            //以输入文件方式输入数据
ofstream fout("Prim_out.txt");//                   //以输出文件方式输出结果

int p,q;
bool is_arrived[501];//            用来判断该点是否已经被选入MST中
int Length,Vertex,SetNum,State;
int Map[501][501],Dist[501]; //Map[][]存放的是两点之间的距离Dist[]
//Map[i][j]表示的是i到j的距离----->Dist[i]

//------------------------------------------------------------------- 
int FindMin()
{
int p;
int Minm,Temp;
Minm=MaxNum;
Temp=0;
for (p=1;p<=Vertex;p++)
 if ((Dist[p]<Minm)&&(!is_arrived[p]))
 {
 Minm=Dist[p];
    Temp=p;
 }
return Temp;// 返回P,也就是节点序号
}

//---------------------------------------------------------------------
int main()
{
memset(is_arrived,0,sizeof(is_arrived));//函数原型:void *memset(void *s, int ch, unsigned n);
//将s所指向的某一块内存中的每个字节的内容全部设置为ch指定的ASCII值, 块的大小由第三个参数指定,这个函数通常为新申请的内存做初始化工作
//其返回值为指向S的指针,此处的作用是将所有节点在初始标记为:未加入MST集合
fin >> Vertex;// 从文件读入一个整数赋值给Vertex
for (p=1;p<=Vertex;p++)
 for (q=1;q<=Vertex;q++)
 {
 fin >> Map[p][q];             //把Prim_in.txt中预先给定的数组赋值给Map[][],表示的是点到点的距离
 if (Map[p][q]==0) Map[p][q]=MaxNum;
 }
Length=0;                        //初始总距离为0
is_arrived[1]=true;//               //把第一个节点纳入MST集合中,并标记为已加入
for (p=1;p<=Vertex;p++)
 Dist[p]=Map[1][p]; //         //Dist[p]存放的是1号节点到其他各点的距离                                                                                                                                                                                                   
 SetNum=1;
//********************************************************************
//**************以上所做全为初始工作,下面开始为核心******************
//********************************************************************  
 do
 {
 State=FindMin();//  //开始新一轮的遍历
 if (State!=0)//       //如果找到有未加入MST集合的点... 
 {
 SetNum=SetNum+1;//  //SetNum用来统计已经加入MST集合的点总数
 is_arrived[State]=true;//  //把该节点标记为:已加入MST集合
 Length=Length+Dist[State];///总的权值
 for (p=1;p<=Vertex;p++)
 if ((Map[State][p]<Dist[p])&&(!is_arrived[p]))//接着从这个节点开始计算  
  //它到与它相连的其他各点的权值最小者
 Dist[p]=Map[State][p];
 }
 else// 如果所有节点都加入MST集了,FindMin()返回的是Temp=0;
 break;
 }
 while (SetNum!=Vertex);//  //当SetNum=Vertex时,所有点已经加入MST集合 
//******************************至此为核心部分*****************************

 //MST成功--->输出错误消息,失败--->输出总路径之和
 if (SetNum!=Vertex)
 fout << "The graph is not connected!";
 else
 fout << Length;
 fin.close();
 fout.close();
 return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值