prim算法

来源:互联网 发布:淘宝前端属于ucd 编辑:程序博客网 时间:2024/06/11 22:48

题目信息
运行结果
本题排行
讨论区

布线问题
时间限制: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<stdio.h>#include<vector>#include<cstdlib>#include<cstring>using namespace std;int map[505][505]={0};int prim(int v){    int llong[505]={0};    int dic[505]={0};    int sum=0,pos;    pos=1;    dic[pos]=1;    for(int i=1;i<=v;i++){        llong[i]=map[pos][i];    }    for(int l=1;l<v;l++){        int minn=10000;        for(int i=1;i<=v;i++){            if(llong[i]<minn&&llong[i]&&!dic[i]){                minn=llong[i];                pos=i;            }        }        sum+=minn;        dic[pos]=1;        for(int i=1;i<=v;i++){            if((llong[i]==0||(llong[i]>map[pos][i]&&map[pos][i]))&&!dic[i]){                llong[i]=map[pos][i];            }        }    }    return sum;}int main(){    int k;    scanf("%d",&k);    while(k--){        int v,e;        memset(map,0,sizeof(map));        scanf("%d%d",&v,&e);        int a,b,c,hh;        for(int i=0;i<e;i++){            scanf("%d%d%d",&a,&b,&c);            map[a][b]=c;            map[b][a]=c;        }        int minn=-1;        for(int i=0;i<v;i++){            scanf("%d",&hh);            if(minn==-1)                minn=hh;            else                if(minn>hh)                minn=hh;        }        printf("%d\n",prim(v)+minn);    }    return 0;}        
0 0
原创粉丝点击