zoukankan      html  css  js  c++  java
  • poj1258prim算法

    /*poj 1258 
     *题意:有若干个农场,现需要将各个农场用光纤连接起来,各个农场之间连接的光纤长度也许不同,
     *要求求出使得将所有农场连接起来的最短光线长度 
     *算法分析:使用矩阵将各个农场之间的光线长度存储起来、然后使用prim算法 
    */
    
    #include <stdio.h>
    #include <string.h>
    #define MaxInt 0x3f3f3f3f
    #define N 110
    //创建map二维数组储存图表,low数组记录每2个点间最小权值,visited数组标记某点是否已访问
    int map[N][N],low[N],visited[N];
    int n;
     
    int prim()
    {
        int i,j,pos,min,result=0;
        memset(visited,0,sizeof(visited));
    //从某点开始,分别标记和记录该点
        visited[1]=1;pos=1;
    //第一次给low数组赋值
        for(i=1;i<=n;i++)
            if(i!=pos) low[i]=map[pos][i];
    //再运行n-1次
        for(i=1;i<n;i++)
        {
    //找出最小权值并记录位置
         min=MaxInt;
         for(j=1;j<=n;j++)
             if(visited[j]==0&&min>low[j])
             {
                 min=low[j];pos=j;
             }
    //最小权值累加
        result+=min;
    //标记该点
        visited[pos]=1;
    //更新权值
        for(j=1;j<=n;j++)
            if(visited[j]==0&&low[j]>map[pos][j])
                low[j]=map[pos][j];
        }
        return result;
    }
     
    int main()
    {
        int i,v,j,ans;
        while(scanf("%d",&n)!=EOF)
        {
    //所有权值初始化为最大
            memset(map,MaxInt,sizeof(map));
            for(i=1;i<=n;i++)
                for(j=1;j<=n;j++)
                {
                    scanf("%d",&v);
                    map[i][j]=map[i][j]=v;
                }
                ans=prim();
                printf("%d
    ",ans);
        }
        return 0;
    }

  • 相关阅读:
    什么是数据挖掘?
    Oracle 泵导入导出
    如何创建一个 mongo 数据库并为它添加一个认证用户?
    如何提高 windows 的使用效率?--巧用运行命令
    在 vs2017 中使用 C# 7 新特性。
    什么是按引用传递和按值传递?
    Vue、Vuex+Cookie 实现自动登陆 。
    Web.config 灵活配置
    远程终端
    js框架总结
  • 原文地址:https://www.cnblogs.com/Tovi/p/6194838.html
Copyright © 2011-2022 走看看