最小生成树--Prim

最小生成树----Prim

思路:

  1. 任意找一个点
  2. 遍历这个点的所有边,并找到未经过点的且权值最小的边,将其累加起来
  3. 通过这条边,找到下一个点
  4. 重复2和3,直到遍历所有的点
                 时间复杂度O(n²)

    Code:

    #include<iostream>
    #include<memory.h>
    #include<cmath>
    using namespace std;
    const int INF=9999999;
    int v[5005];//判断某个点是否被遍历过
    int d[5005];//已经遍历过的点到其余点的距离
    int g[5005][5005],n,m,ans=0;
    int prim(int s)
    {
     memset(v,0,sizeof(v));
     int k;
     for(int i=1;i<=n;i++)
     {
         d[i]=g[s][i];//存在就赋值,不存在就是正无穷
     }
     v[s]=1;//起点已经遍历过
     d[s]=0;//起点到起点的距离为0
     for(int i=1;i<=n-1;i++)
     {
         int minn=INF;//初始化最小值
         for(int j=1;j<=n;j++)
         {
             if(v[j]==0&&minn>d[j])
             {
                 minn=d[j];
                 k=j;
             }
         }
         v[k]=1;//给遍历过的点打好标记
         d[k]=0;//遍历过的点到本身的距离为0
         ans+=minn;//将最小值累加
         for(int j=1;j<=n;j++)
         {
             if(v[j]==0&&d[j]>g[k][j]) d[j]=g[k][j];//更新已经遍历过的点到其余点的距离
         }
     }
     return ans;
    }
    int main()
    {
     cin>>n>>m;    
     for(int i=1;i<=n;i++)
     for(int j=1;j<=n;j++)
     g[i][j]=INF;
     for(int i=1;i<=m;i++)
     {
         int x,y,z;
         cin>>x>>y>>z;
         g[x][y]=g[y][x]=min(z,g[x][y]);
     }
     int t=prim(1);
     if(t==-1) cout<<"orz";
     else cout<<t;
     return 0;
    }
全部评论

相关推荐

不愿透露姓名的神秘牛友
11-27 10:48
点赞 评论 收藏
分享
一个菜鸡罢了:哥们,感觉你的简历还是有点问题的,我提几点建议,看看能不能提供一点帮助 1. ”新余学院“别加粗,课程不清楚是否有必要写,感觉版面不如拿来写一下做过的事情,教育经历是你的弱势就尽量少写 2. “干部及社团经历”和“自我评价”删掉 3. 论文后面的“录用”和“小修”啥的都删掉,默认全录用,问了再说,反正小修毕业前肯定能发出来 4. 工作经验和研究成果没有体现你的个人贡献,着重包装一下个人贡献
点赞 评论 收藏
分享
有趣的牛油果开挂了:最近这个阶段收到些杂七杂八的短信是真的烦
点赞 评论 收藏
分享
蚂蚁 基架java (n+6)*16 签字费若干
点赞 评论 收藏
分享
评论
1
收藏
分享
牛客网
牛客企业服务