最小生成树-普里姆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;
}
左飞: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;
}
相关文章推荐
- 最小生成树 Prim(普里姆)算法和Kruskal(克鲁斯特尔)算法
- 最小生成树——普里姆(Prim)算法
- C++ 最小生成树之Prim(普里姆)算法
- 最小生成树的普里姆(Prim)算法
- 算法:图解最小生成树之普里姆(Prim)算法
- 最小生成树(MST)----普里姆(Prim)算法与克鲁斯卡尔(Kruskal)算法
- 求最小生成树,普里姆(Prim)算法
- 数据结构之---C语言实现最小生成树之prim(普里姆)算法
- 最小生成树之克鲁斯卡尔(Kruskal)算法、普里姆(prim)算法
- 最小生成树prim(普里姆)算法
- 最小生成树之Prim(普里姆)算法
- 图解最小生成树 - 普里姆(Prim)算法
- java 普里姆(Prim)算法求图的最小生成树
- 求最小生成树,普里姆(Prim)算法
- 最小生成树之Prim(普里姆)算法
- 最小生成树算法(上)——Prim(普里姆)算法
- 无向图最小生成树Prim(普里姆)算法
- 最小生成树之普里姆(Prim)算法
- 最小生成树之Prim(普里姆)算法
- 算法:图解最小生成树之普里姆(Prim)算法