您的位置:首页 > 其它

最小生成树-普里姆Prim()算法

2011-10-22 10:20 295 查看
/*

左飞:C++数据结构原理与经典问题求法

最小生成树-普里姆Prim()算法

时间:2011/10/22

*/

#include<iostream.h>

#include<iomanip.h>

#include<fstream>

using namespace std;

#define MaxVer 10

#define MaxWeight 100

int main()

{

cout<<"本程序的结点个数最大为10,边的权为0~99"<<endl;

int G[MaxVer][MaxVer],in[MaxVer] = {0},path[MaxVer][2];//G存储边的权,in为顶点标记,in[i]=1为起点,=0为终点,path为路径

int i,j,k;//循环变量

int num =6,statue=0,start=0;//num为顶点个数。

int result = 0;//最小代价

//由于所给文件不是图矩阵,而是边的信息,所以需对二维数组进行初始化。

for(i=0;i<num;i++)

for(j=0;j<num;j++)

{

G[i][j] = MaxWeight;//不可到达边

// if(i == j)

// G[i][j] = 0;

}

ifstream file;

file.open("data.txt");

if(file == NULL)

{

cerr<<"文件打开失败!"<<endl;

exit(1);

}

//从文件读入数据

while(!file.eof())

{

int begin,end,weight;

char t;

file>>begin>>t>>end>>t>>weight;

G[begin-1][end-1] = weight;

G[end-1][begin-1] = weight;

}

file.close();

//判断改图是否是连通图,若不是,退出程序

for(i = 0;i<num;i++)

{

statue = 0;

for(j=0;j<num;j++)

{

// cout<<setw(3)<<G[i][j]<<ends;

if(G[i][j]<MaxWeight)//如果从i出发有可到达结点,说明有一条边可到达此结点,它不是孤立的

{

statue = 1;

break;

}

}

// cout<<endl;

if(statue == 0)

{

cout<<"此图非连通图,不能计算最小生成树!"<<endl;;

return 0;

break;

}

}

/* if(!statue)

{

cout<<"此图非连通图,不能计算最小生成树!"<<endl;;

return 0;

}*/

//输入算法起点

while(true)

{

cout<<"输入算法起点:";

cin>>start;

if(start>0 && start<=num)

break;

cout<<"输入错误,请重新输入!"<<endl;

}

// prime()算法。

in[start-1] = 1;//标记,以start为起点

for(k=0;k<num-1;k++)

{

int min = MaxWeight,v1,v2;

for(i=0;i<num;i++)

for(j=0;j<num;j++)

{

if(G[i][j]< min && in[i] && (!in[j]))//结点i在已标记集合U里,结点j在未标记集合V里.

{

v1 = i;

v2 = j;

min = G[i][j];

}

}

if(in[v2] == 0)//如果结点v2在未标记集合里,则就v2标记,添加到最小生成树里。

{

result += G[v1][v2];

path[k][0] = v1+1;

path[k][1] = v2+1;

// in[v1] = 1;

in[v2] = 1;

min = MaxWeight;

}

}

//输出结果

cout<<"最小代价为:"<<result<<endl;

cout<<"路径为:"<<endl;

for(i=0;i<num-1;i++)

cout<<path[i][0]<<"-"<<path[i][1]<<endl;

return 0;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: