您的位置:首页 > 其它

最小生成树 prim hdu1233 还是畅通工程

2014-08-16 16:38 211 查看
c++代码实现

#include<iostream>
using namespace std;
const int maxnum=105;
const int maxint=99999;
int map[maxnum][maxnum];
int lowcost[maxnum];//记录的是以节点i为终点的最小边权值
bool vis[maxnum];//标记已识别的点,相当于起点
int dist;//记录最终的权值总和

void Prim(int N,int map[maxnum][maxnum])
{
//初始化
for(int i=1;i<=N;i++)
{
lowcost[i]=map[1][i];//以1为最初起点,i为终点的权值
vis[i]=0;
}
vis[1]=1;//第一个点已被标记
dist=0;//最初权值为0;

int u=1;
/* n个节点至少需要N-1条边构成最小生成树 */
for(int i=1;i<N;i++)
{
int temp=maxint;

//找到以u为终点的最小权值的边
for(int j=1;j<=N;j++)
{
if(!vis[j]&&lowcost[j]<temp)
{
u=j;
temp=lowcost[j];
}
}
//累计权值
dist=dist+temp;
//标记节点u到生成树
vis[u]=1;
//更新当前节点到其他节点的权值
for(int k=1;k<=N;k++)
{
//发现更小权值
if(!vis[k]&&map[u][k]<lowcost[k])
lowcost[k]=map[u][k];
}

}
cout<<dist<<endl;
}
int main ()
{
int   N;//输入节点
while(cin>>N)
{
if(N==0)
break;
int A,B,D;//两个节点,及之间的距离

//初始化节点之间的距离,假设都不相连,无穷大(取无穷大为maxint)
for(int i=1;i<=N;i++)
for(int j=1;j<=N;j++)
map[i][j]=maxint;

//输入各个节点之间的距离
for(int i=1;i<=N*(N-1)/2;i++)
{
cin>>A>>B>>D;
if(D<maxint)
{
map[A][B]=D;
map[B][A]=D;//无向图
}

}
Prim(N,map);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息