一、题目: Constructing Roads
二、题意: http://acm.pku.edu.cn/JudgeOnline/problem?id=2421
三、解决办法:
用最小生成树Prim算法
四、源代码:
#include "stdio.h"
#include "stdlib.h"
#define N 110
#define MAX 1000000
int map[N][N];
int Dis[N];
int n;
int result = 0;
bool flag[N];
void Prim()
{
int i, j, k;
int min;
memset(flag, false, sizeof(flag));
flag[0] = true;
//将每边的权值先赋值给Dis,以便计算
for (i = 0; i < n; i++)
{
Dis[i] = map[0][i];
}
for (i = 1; i < n; i++)
{
min = MAX;
//寻找当前的最小值
for (j = 0; j < n; j++)
{
if (!flag[j] && Dis[j] < min)
{
min = Dis[j];
k = j;
}
}
//对此结点记录,以使下一次不会检测到
flag[k] = true;
//相加,记录总权值
result += Dis[k];
//寻找下一个最小值
for (j = 0; j < n; j++)
{
if (!flag[j] && map[k][j] >= 0 && map[k][j] < Dis[j])
{
Dis[j] = map[k][j];
}
}
}
}
int main()
{
int Q;
int a, b;
int i, j;
while (scanf("%d", &n) != EOF)
{
for (i = 0; i < n; i++)
{
for (j = 0; j < n; j++)
{
scanf("%d", &map[i][j]);
}
}
scanf("%d", &Q);
for (i = 0; i < Q; i++)
{
scanf("%d%d", &a, &b);
map[a - 1][b - 1] = 0;
map[b - 1][a - 1] = 0;
}
Prim();
printf("%d/n",result);
}
return 0;
}