zoukankan      html  css  js  c++  java
  • 一本通【例4-10】最优布线问题

    一本通【例4-10】最优布线问题 

    题目链接

    http://ybt.ssoier.cn:8088/problem_show.php?pid=1349


     问题描述

      学校有n台计算机,为了方便数据传输,现要将它们用数据线连接起来。两台计算机被连接是指它们间有数据线连接。由于计算机所处的位置不同,因此不同的两台计算机的连接费用往往是不同的。

        当然,如果将任意两台计算机都用数据线连接,费用将是相当庞大的。为了节省费用,我们采用数据的间接传输手段,即一台计算机可以间接的通过若干台计算机(作为中转)来实现与另一台计算机的连接。

      现在由你负责连接这些计算机,任务是使任意两台计算机都连通(不管是直接的或间接的)。

     


     输入格式

      输入文件wire.in,第一行为整数n(2<=n<=100),表示计算机的数目。此后的n行,每行n个整数。第x+1行y列的整数表示直接连接第x台计算机和第y台计算机的费用。

     


     输出格式

      输出文件wire.out,一个整数,表示最小的连接费用。

     


     输入样例

      3

      0 1 2

      1 0 1

      2 1 0

     


     输出样例

        2   (注:表示连接1和2,2和3,费用为2)

     


     思路

      也是一道模板题,使用prim算法,详细思路在代码里有

     


     代码

    #include<iostream>
    #include<cstdio>
    #include<algorithm>
    #include<cmath>
    #include<list>
    #include<cstring>
    #define maxn 1010
    using namespace std;
    
    //我们利用邻接矩阵存储
    int g[maxn][maxn];
    int minn[maxn];//存放最小值
    bool u[maxn];//判断是否在生成树中
    long long ans=0;//答案(最小连接费用)
    
    int main() {
        int n; 
        scanf("%d",&n);
        for(int i=1; i<=n; i++) {
            for(int j=1; j<=n; j++) {
                scanf("%d",&g[i][j]);
            }
        }
        memset(minn,0x7f,sizeof(minn));//初始化为最大值
        minn[1]=0;//我们从第一个点开始,所以自己到自己的距离为0
        memset(u,true,sizeof(u));//初始化都为TRUE,表示所有的点都是蓝点
        for(int i=1; i<=n; i++) {
            int k=0;
            for(int j=1; j<=n; j++) { //找一个与白点连接的权值最小的蓝点k
                if(u[j] && minn[j]<minn[k])
                    k=j;
            }
            u[k]=false;//蓝点进入生成树就变成白点
            for(int j=1;j<=n;j++){
                if(u[j] && g[k][j]<minn[j]){
                    minn[j]=g[k][j];
                }
            } 
        }
        for(int i=1;i<=n;i++){
            ans+=minn[i];//累加上最小权值输出即可 
        }
        cout<<ans<<'
    ';
        //今天听学长说可以用cout输出,这样还有可能比printf快
        //所以听学长的啦 
        return 0; 
    }

     

  • 相关阅读:
    Two Sum II
    Subarray Sum
    Intersection of Two Arrays
    Reorder List
    Convert Sorted List to Binary Search Tree
    Remove Duplicates from Sorted List II
    Partition List
    Linked List Cycle II
    Sort List
    struts2结果跳转和参数获取
  • 原文地址:https://www.cnblogs.com/loceaner/p/10684061.html
Copyright © 2011-2022 走看看