关闭

NYOJ-38-布线问题(普利姆)

标签: 普利姆
283人阅读 评论(0) 收藏 举报
分类:

布线问题
时间限制: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

#include<iostream>
#include<algorithm>
#include<stdio.h>
#include<string.h>
#include<math.h>
using namespace std;
const int maxn=505;
const int INF=0x3f3f3f3f;
int map[maxn][maxn];
int dis[maxn];
int vis[maxn];
int N;//N组测试数据
int V;//点的数量
int E;//边的数量
int min_num;//最小外接花费
void init()
{
    scanf("%d%d",&V,&E);
    for(int i=0; i<=V; i++)//初始化图
        for(int j=0; j<=V; j++)
            i==j?map[i][j]=0:map[i][j]=INF;
    while(E--)//建图
    {
        int a,b,c;
        scanf("%d%d%d",&a,&b,&c);
        map[a][b]=c;//无向图
        map[b][a]=c;
    }
    min_num=INF;
    for(int i=1; i<=V; i++)
    {
        int x;
        scanf("%d",&x);
        min_num=min(min_num,x);//生成树连接到外界的最小花费
        dis[i]=map[i][1];//从1开始构造最小生成树
    }
    memset(vis,0,sizeof(vis));
    vis[1]=1;//0代表是外界
}
void Prim()
{
    int min_cost=0;//初始化最小花费
    for(int i=1; i<V; i++)
    {
        int minn=INF;
        int point_minn;
        for(int j=1; j<=V; j++)
            if(vis[j]==0&&minn>dis[j])
            {
                point_minn=j;
                minn=dis[j];
            }
        if(minn==INF)
            break;
        min_cost+=dis[point_minn];
        vis[point_minn]=1;
        for(int j=1; j<=V; j++)
            if(vis[j]==0&&dis[j]>map[point_minn][j])
                dis[j]=map[point_minn][j];
    }
    printf("%d\n",min_cost+min_num);
}
int main()
{
    scanf("%d",&N);
    while(N--)
    {
        init();
        Prim();
    }
    return 0;
}
0
0
查看评论

最小生成树-普利姆算法eager实现

在普利姆算法的lazy实现中,参考:普利姆算法的lazy实现 我们现在来考虑这样一个问题: 我们将所有的边都加入了优先队列,但事实上,我们真的需要所有的边吗? 我们再回到普利姆算法的lazy实现,看一下这个问题: 当顺着顶点0的邻接表考察顶点7时,边7-2和边7-1被加入了优先队列Q.然...
  • gsky1986
  • gsky1986
  • 2015-04-21 23:20
  • 850

拓扑排序 详解+最小生成树(MST)详解 【普利姆算法 + 优先队列优化 & 克鲁斯卡尔算法】

好基友YanBaoC的另一篇巨作,又被我剽窃
  • u013486414
  • u013486414
  • 2014-09-02 16:02
  • 1075

普利姆算法通俗讲解

文章作者:duguyue100 今天就来讨论一下贪心法中另一个解决最小生成树的算法:prim算法。在解决最小生成树的算法中,prim算法应该是最优的了,时间复杂是O(n² ㏒n)。下面我们来了解一下算法的运作原理。    在prim算法中,最小生成树是一步步建立起来的...
  • tiancaixuchao2009
  • tiancaixuchao2009
  • 2011-08-05 23:52
  • 1428

图-普利姆(Prime)算法

普利姆(Prime)算法(只与顶点相关)       最近,重温图的一些算法。       带权图分为有向和无向,构造连通网络最小代价(即连接各顶点路径权值之和最小)的最短路径又叫做最小生成树,有prime算法和kru...
  • nicajonh
  • nicajonh
  • 2016-08-13 16:53
  • 693

普利姆(prim)算法和克鲁斯卡尔(kruskal)算法

连通网的最小生成树算法: 1.普里姆算法——”加点法”。 假设N=(V,{E})是连通网,TE为最小生成树的边集合。 (1)初始U={u0}(u0∈V),TE=φ; (2)在所有u∈U, v∈V-U的边(u,v)中选择一条代价最小的边(u0,v0)并入集合TE,同时将v0并入U;(并修...
  • Solo95
  • Solo95
  • 2016-05-18 17:36
  • 1253

Prim 普里姆算法的java实现

<br />  普里姆算法,主要是用于求最小生成树的典型算法,其实现简单。<br />  package algorithm; import java.util.Scanner; public class Prim { public s...
  • lazy_p
  • lazy_p
  • 2010-07-31 18:17
  • 2304

数据结构与算法-最小生成树—普里姆算法

主要介绍最小生成树中的:
  • ljp1919
  • ljp1919
  • 2014-08-08 13:38
  • 1973

C语言普里姆算法的实现

普里姆算法
  • ZGUIZ
  • ZGUIZ
  • 2017-01-20 18:30
  • 751

HDOJ 1863 畅通工程——普利姆算法

风格
  • sxj1995
  • sxj1995
  • 2014-08-26 16:30
  • 324

nyoj-38-布线问题

布线问题 时间限制:1000 ms  |  内存限制:65535 KB 难度:4 描述南阳理工学院要进行用电线路改造,现在校长要求设计师设计出一种布线方式,该布线方式需要满足以下条件: 1、把所有的楼都供上电。 2、所用电线花费最...
  • wximo
  • wximo
  • 2014-05-14 19:46
  • 330
    个人资料
    • 访问:142907次
    • 积分:5538
    • 等级:
    • 排名:第5728名
    • 原创:415篇
    • 转载:6篇
    • 译文:0篇
    • 评论:46条
    最新评论