您的位置:首页 > 其它

布线问题(prime算法)

2014-03-06 17:35 176 查看


布线问题

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

最小生成树算法实现:

intree表示是否在树中, dis数组表示树到点的最小边值, 每次只更新新入的边的邻接点的值, 如果此点不在树中, 并且边的值比数组中原来的值小, 就更新, 然后遍历整个数组, 寻找不在树中的, 而且
距离树最小的点

代码:

一定要将freopen注释掉再提交

#include<iostream>
using namespace std;
#include<stdio.h>
#include<string.h>
#include<vector>
#define N 501
#define Max 200

typedef struct{
int v;
int w;
}edge;

vector<edge> graph
;
int degree
;
int nvertices, nedges;
int min1;
int dis
;
int intree
;

void read();
void prime();
void print();

int main(){
int out, n;
//	freopen("in.txt", "r", stdin);
scanf("%d", &n);
while(n--){
out = 0;
read();
prime();
for(int i = 1; i <= nvertices; i++){
out += dis[i];
}
printf("%d\n", out + min1);
}

return 0;
}

void read(){
int a, b, c, i;
edge e;

scanf("%d%d", &nvertices, &nedges);
//printf("%d\t%d\n", nvertices, nedges);
for(i = 0; i < N; i++){//清空vector
graph[i].clear();
}
while(nedges--){
scanf("%d%d%d", &a, &b, &c);
e.v = b;
e.w = c;
graph[a].push_back(e);
e.v = a;
e.w	= c;
graph[b].push_back(e);	//输入一个数
}

min1 = 63000;
i = nvertices;
while(i--){
scanf("%d", &a);
min1 = min1 < a ? min1 : a;
}
}

void prime(){
int i, j, v, len, w;
memset(intree, 0, sizeof(intree));//初始化数组
for(i = 0; i <= N; i++ ){
dis[i] = Max;
}

int s = 1;//设为从1开始出发找生成树
dis[s] = 0;

while(intree[s] == 0){//此点不在树中
intree[s] = 1;
len = graph[s].size();
for(i = 0; i < len; i++){
v = graph[s][i].v;
w = graph[s][i].w;
if(intree[v] == 0 && dis[v] > w){//更新不在树中的邻接点
dis[v] = w;
}
}

/*	for(i = 1; i <= nvertices; i++){
printf("%d\t", dis[i] );
}
printf("\n");
*/
int disk = Max;
for(i = 1; i <= nvertices; i++){//寻找和树相连的权最小的点
if(intree[i] == 0 && disk > dis[i]){
s = i;
disk = dis[i];
}
}
}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: