传送门:HDU 1102 Constructing Roads
分析:
prim模版题目。
代码如下:
#include <stdio.h>
#include <string.h>
int map[105][105],dis[105],vis[105];
int main() {
int cas,i,j,k,valid,a,b,sumD,min;
while(scanf("%d",&cas) != EOF) {
for(i=0; i<cas; i++)
for(j=0; j<cas; j++)
scanf("%d",&map[i][j]);
scanf("%d",&valid);
for(i=0; i<valid; i++) {
scanf("%d%d",&a,&b);
map[a-1][b-1] = map[b-1][a-1] = 0;
}
// Prim start
// init
sumD = 0;
memset(vis, 1, sizeof(vis));
for(i=0; i<cas; i++)
dis[i] = map[0][i]; // 初始化距离函数
vis[0] = 0; // already in tree
// find n-1 dot
for(i=1; i<cas; i++) {
min = 1000000;
// find next nearly dot
for(j=1; j<cas; j++)
if(dis[j]<min && vis[j])
min = dis[j], k = j;
vis[k] = 0;
sumD += min;
for(j=1; j<cas; j++)
if(vis[j] && dis[j] > map[k][j])
dis[j] = map[k][j];
}
printf("%d\n", sumD);
}
return 0;
}