• 最小生成树模板prim和kruskal


    题目链接

    Prim算法:加点法。两个集合S和T,集合S是已经加入的集合,T是待加入的点的集合,每次在集合T中找距离集合S中的所有点距离最短(dis存储)的点,加入集合S,并用该点更新剩余点距离集合S点最近距离dis。

    1. #include
    2. #include
    3. #define MAXN 1010
    4. #define inf 8989898
    5. using namespace std;
    6. int graph[MAXN][MAXN];
    7. int dis[MAXN],vis[MAXN];
    8. int main(){
    9. int n,m;//1-n
    10. cin>>n>>m;
    11. //初始化
    12. fill(graph[0],graph[0]+MAXN*MAXN,inf);
    13. fill(dis,dis+MAXN,inf);
    14. for(int i=0;i
    15. int a,b,c;
    16. cin>>a>>b>>c;
    17. graph[a][b]=graph[b][a]=c;
    18. }
    19. int u=1;
    20. dis[u]=0;
    21. long long sum=0;
    22. for(int i=1;i<=n;i++){
    23. int minDis=inf,v=-1;
    24. for(int j=1;j<=n;j++){
    25. if(!vis[j]&&minDis>dis[j]){
    26. v=j;
    27. minDis=dis[j];
    28. }
    29. }
    30. vis[v]=1;
    31. sum+=dis[v];
    32. for(int j=1;j<=n;j++){
    33. if(!vis[j]&&dis[j]>graph[v][j]){
    34. dis[j]=graph[v][j];
    35. }
    36. }
    37. }
    38. cout<
    39. return 0;
    40. }

    Kruskal算法:加边法。利用并查集和排序。权重从小达到遍历,每次添加一条边(两端不连通),添加n-1次。

    1. #include
    2. #include
    3. #define MAXN 100010
    4. using namespace std;
    5. int p[MAXN];
    6. void init(){
    7. for(int i=0;i
    8. }
    9. int find(int a){
    10. if(a!=p[a])p[a]=find(p[a]);
    11. return p[a];
    12. }
    13. void merge(int a,int b){
    14. int pa=find(a),pb=find(b);
    15. if(pa!=pb)p[pb]=pa;
    16. }
    17. struct Edge{
    18. int from,to,length;
    19. };
    20. struct Edge edge[MAXN];
    21. bool cmp(Edge&a,Edge &b){
    22. return a.length
    23. }
    24. int main(){
    25. init();
    26. int n,m;//1-n
    27. cin>>n>>m;
    28. for(int i=0;i
    29. int a,b,c;
    30. cin>>edge[i].from>>edge[i].to>>edge[i].length;
    31. }
    32. sort(edge,edge+m,cmp);
    33. long long sum=0;
    34. int ct=0;
    35. for(int i=0;i
    36. if(find(edge[i].from)!=find(edge[i].to)){
    37. merge(edge[i].from,edge[i].to);
    38. sum+=edge[i].length;
    39. ct++;
    40. }
    41. if(ct==n-1)break;
    42. }
    43. cout<
    44. return 0;
    45. }

    意外收获:

    以前没有注意fill和memset函数,这里总结一下。

    fill(arr_start,arr_end,value)//数组中元素填充value,头文件是algorithm

    memset(arr,value,sizeof(arr))//按照每个字节赋值arr,头文件是string.h

    比较:由于memset按字节赋值的特性  memset事实上比 fill 快很多 ,节省了时间

  • 相关阅读:
    扩展的多曝光图像合成算法及其在单幅图像增强中的应用。
    软件项目管理 7.4.1.进度计划编排-超前与滞后方法
    人机杂感
    Java经典面试题
    【开发规范】
    MATLAB矩阵
    JS-BOM-阶乘计算
    6、数据访问
    Qt视频播放器实现(目录)
    猿创征文|全方位快速了解事务的4种隔离级别
  • 原文地址:https://blog.csdn.net/weixin_52030057/article/details/132953326