最小生成树——Prim算法(C++)

源代码:

#include<cstdio>
#include<cstring>
int m,n,i[1001][1001],h[1001];
bool f[1001]={0};
long long ans(0);
int main()
{
    memset(h,0x3f,sizeof(h));  //将数组初始化,定义为最大值,为下面查找最小值做铺垫。
    h[1]=0;  //从编号为1的节点开始查找。
    scanf("%d%d",&n,&m);
    for (int a=1;a<=m;a++)
    {
        int x,y,z;
scanf(
"%d%d%d",&x,&y,&z); i[x][y]=i[y][x]=z; //注意这是无向图。 } for (int a=1;a<=n;a++) //注意循环次数。 {   int t(0);   for (int b=1;b<=n;b++)   if (!f[b]&&(h[b]<h[t]))   t=b;   f[t]=true;   for (int b=1;b<=n;b++)   if (!f[b]&&(h[b]>i[t][b]))   h[b]=i[t][b]; } //同理于Dijkstra算法。 for (int a=1;a<=n;a++) ans+=h[a]; //所有的正确边的权值已被查找更新完毕,累加就可以了。 printf("%d",ans); return 0; }
posted @ 2016-01-04 20:59  【機關】  阅读(328)  评论(0编辑  收藏  举报