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;
    }

  • 相关阅读:
    SqlSugar的基本使用
    File文件操作类
    FTP文件操作类
    ASP.NET WebApi使用Swagger做接口文档
    asp.net中WebService 捕获全局异常
    net log4net 通用配置
    jQuery插件开发模式(转)
    js 对Cookie进行增删改操作
    使用JQ实现相同行或列合并
    sql 取得某个时间段内的所有月份和日期
  • 原文地址:https://www.cnblogs.com/Tovi/p/6194838.html
Copyright © 2011-2022 走看看