高温假闲着无聊,在voj上把CSU的机试题 刷了一道,可能是因为题目年代比较久远,题目的难度并不是很大。稍稍整理一下,希望以后用得着。
1264: 惠民工程
所有题目中唯一的数据结构题
一道最小生成树(MST)的模板题
MST问题的解法:Prim,Kruskal等
Description
市政府“惠民工程”的目标是在全市n个居民点间之架设煤气管道(但不一定有直接的管道相连,只要能间接通过管道可达即可)。很显然最多可架设 n(n-1)/2条管道,然而实际上要连通n个居民点只需架设n-1条管道就可以了。现请你编写程序,计算出该惠民工程需要的最低成本。
Input
测试输入包含若干测试用例。每个测试用例的第1行给出居民点数目M ( < =100 )、 评估的管道条数 N;随后的 N 行对应居民点间管道的成本,每行给出一对正整数,分别是两个居民点的编号,以及此两居民点间管道的成本(也是正整数)。为简单起见,居民点从1到M编号。
Output
对每个测试用例,在1行里输出全市管道畅通所需要的最低成本。若统计数据不足以保证畅通,则输出“?”。
Sample Input
3 3
1 2 1
1 3 2
2 3 4
3 1
2 3 2
Sample Output
3
?
Prim代码:
#include <stdio.h>
#define INF 0x7ffff
#define MAXVER 128
typedef struct graph
{
int adjMatrix[MAXVER][MAXVER];
int weight[MAXVER];
int vis[MAXVER];
} graph;
graph Graph;
int m,n;
void init()
{
for(int i=0; i<MAXVER; i++)
{
Graph.vis[i] = 0;
for(int j=0; j<MAXVER; j++)
if(i==j)
Graph.adjMatrix[i][j] = 0;
else
Graph.adjMatrix[i][j] = INF;
}
}
int prim()
{
int ans = 0;
for(int i=1; i<=m; i++)
Graph.weight[i] = Graph.adjMatrix[1][i];
Graph.vis[1] = 1;
for(int i=2; i<=m; i++)
{
int minCost = INF,idx;
for(int j=1; j<=m; j++)
if(!Graph.vis[j]&&minCost>Graph.weight[j])
{
minCost = Graph.weight[j];
idx = j;
}
if(minCost==INF)
return -1;
Graph.vis[idx] = 1;
ans+=Graph.weight[idx];
for(int j=1; j<=m; j++)
if(!Graph.vis[j]&&Graph.weight[j]>Graph.adjMatrix[idx][j])
Graph.weight[j] = Graph.adjMatrix[idx][j];
}
return ans;
}