zoukankan      html  css  js  c++  java
  • 布线问题(prime)

     

    布线问题

    时间限制:1000 ms  |  内存限制:65535 KB
    难度:4
     
    描述
    南阳理工学院要进行用电线路改造,现在校长要求设计师设计出一种布线方式,该布线方式需要满足以下条件:
    1、把所有的楼都供上电。
    2、所用电线花费最少
     
    输入
    第一行是一个整数n表示有n组测试数据。(n<5)
    每组测试数据的第一行是两个整数v,e.
    v表示学校里楼的总个数(v<=500)
    随后的e行里,每行有三个整数a,b,c表示a与b之间如果建铺设线路花费为c(c<=100)。(哪两栋楼间如果没有指明花费,则表示这两栋楼直接连通需要费用太大或者不可能连通)
    随后的1行里,有v个整数,其中第i个数表示从第i号楼接线到外界供电设施所需要的费用。( 0<e<v*(v-1)/2 )
    (楼的编号从1开始),由于安全问题,只能选择一个楼连接到外界供电设备。
    数据保证至少存在一种方案满足要求。
    输出
    每组测试数据输出一个正整数,表示铺设满足校长要求的线路的最小花费。
    样例输入
    1
    4 6
    1 2 10
    2 3 10
    3 1 10
    1 4 1
    2 4 1
    3 4 1
    1 3 5 6
    样例输出
    4
    题解:只能选择一个楼连接到外界供电设备。刚开始没看到这句话,错了;
    代码:
     1 #include<stdio.h>
     2 #include<string.h>
     3 const int MAXN=510;
     4 #define MIN(x,y)(x<y?x:y)
     5 const int INF=0x3f3f3f3f;
     6 int map[MAXN][MAXN];
     7 int low[MAXN],vis[MAXN];
     8 int ans;
     9 int out[MAXN];
    10 //int usd[MAXN];
    11 int N;
    12 void prim(){
    13     memset(vis,0,sizeof(vis));
    14 //    memset(usd,0,sizeof(usd));
    15     vis[1]=1;
    16     for(int i=1;i<=N;i++)low[i]=map[1][i];
    17     for(int i=1;i<=N;i++){
    18         int temp=INF,k;
    19         for(int j=1;j<=N;j++)
    20             if(!vis[j]&&low[j]<temp)temp=low[k=j];
    21             if(temp==INF)break;
    22             //if(out[k]<temp)ans+=out[k],usd[k]=1;
    23             //else 
    24             ans+=temp;
    25             vis[k]=1;
    26             for(int j=1;j<=N;j++)
    27                 low[j]=MIN(low[j],map[k][j]);
    28     }int temp=INF;
    29     for(int i=1;i<=N;i++){
    30         //if(usd[i])continue;
    31         temp=MIN(temp,out[i]);
    32     }
    33     //if(temp==INF)temp=0;
    34     printf("%d
    ",ans+temp);
    35 }
    36 int main(){
    37     int n,e,a,b,c;
    38     scanf("%d",&n);
    39     while(n--){
    40         ans=0;
    41         memset(map,INF,sizeof(map));
    42         scanf("%d%d",&N,&e);
    43         while(e--){
    44             scanf("%d%d%d",&a,&b,&c);
    45             if(c<map[a][b])map[a][b]=map[b][a]=c;
    46         }
    47         for(int i=1;i<=N;i++)scanf("%d",&out[i]);
    48         prim();
    49     }
    50     return 0;
    51 }
  • 相关阅读:
    实现类似add(1)(2)(3)的函数
    Chrome安装助手踩坑
    升级webpack4错误处理
    vue项目埋点
    如何理解vue中的v-bind?
    不能不知道的webpack基本配置
    IE9及以下浏览器升级提示
    HTML5常用API
    css中clip属性
    Web开发展望
  • 原文地址:https://www.cnblogs.com/handsomecui/p/4820551.html
Copyright © 2011-2022 走看看