zoukankan      html  css  js  c++  java
  • NYOJ 38 布线问题_(解法2 Prim算法)

    时间限制: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



    #include <iostream>
    #include <cstdio>
    #include <cstring>
    #include <algorithm>
    #include <limits.h>
    #include <malloc.h>
    
    using namespace std;
    
    int sum;
    
    void Prim(int **node, int v)
    {
    	sum=0;
    	int i,j,k,min;
    	int *minCost=(int *)malloc(sizeof(int)*v);
    
    	minCost[0]=0;
    
    	for(i=1;i<v;i++)
    		minCost[i]=node[0][i];
    
    	for(i=1;i<v;i++)
    	{
    		min=INT_MAX;
    		for(j=1,k=1;j<v;j++)
    		{
    			if(minCost[j] && minCost[j]<min)
    			{
    				min=minCost[j];
    				k=j;
    			}
    		}
    
    		sum+=minCost[k];
    		minCost[k]=0;
    
    		for(j=1;j<v;j++)
    		{
    			if(minCost[j] && minCost[j]>node[k][j])
    			{
    				minCost[j]=node[k][j];
    			}
    		}
    	}
    }
    
    int main()
    {
    	int n,v,e,i,j,k,l;
    	scanf("%d",&n);
    	while(n--)
    	{
    		scanf("%d%d",&v,&e);
    
    		int **node=(int **)malloc(sizeof(int*)*v); 
    
    		for(i=0;i<v;i++)
    			node[i]=(int *)malloc(sizeof(int)*v);
    
    		for(i=0;i<v;i++)
    			for(j=0; j<v; j++)
    				node[i][j]=INT_MAX;
    
    
    		for(l=0;l<e;l++)
    		{
    			scanf("%d%d%d",&i,&j,&k);
    			node[i-1][j-1]=node[j-1][i-1]=k;
    		}
    
    		Prim(node, v);
    
    		int *av=(int *)malloc(sizeof(int)*v);
    
    		for(i=0;i<v;i++)
    			scanf("%d",&av[i]);
    		sort(av,av+v);
    
    		printf("%d
    ",sum+av[0]);
    
    	}
    	return 0;
    }


  • 相关阅读:
    关于DOM节点的逆序
    javascript 巧妙的数组去重
    Canvas 学习笔记1
    web前端开发规范
    关于使用new和不使用new
    先知JS分享第二讲 数据类型与操作符
    关于谷歌console的小技巧
    菜鸟读jQuery 2.0.3 源码分析系列(2)
    菜鸟读jQuery 2.0.3 源码分析系列(1)
    local npm module ("*****") not found
  • 原文地址:https://www.cnblogs.com/yxwkf/p/5325297.html
Copyright © 2011-2022 走看看