题解:将已建道路的成本改为0,然后套用prim算法。
#include<iostream>
#include<cstdio>
using namespace std;
#define MAX 0x7fffffff
int map[105][105];
bool used[105];
int lowcost[105];
void Prim(int N)
{
int i, j, k;
for (i = 0; i < N; i++)
{
lowcost[i] = map[0][i];
used[i] = false;
}
used[0] = true;
int minsum = 0;
for (i = 1; i <N; i++)
{
int min = MAX;
int v = -1;
for (j = 0; j <N; j++)
{
if (!used[j] && lowcost[j] < min)
{
min = lowcost[j];
v = j;
}
}
if (v != -1)
{
minsum += lowcost[v];
used[v] = true;
for (k = 0; k < N; k++)
if (!used[k] && map[v][k] < lowcost[k])
lowcost[k] = map[v][k];
}
}
cout << minsum << endl;
}
int main()
{
int n, m;
while (scanf_s("%d", &n) != EOF&&n)
{
m = (n - 1)*n / 2;
int x, y, z, k;
for (int i = 0; i<m; i++)
{
scanf_s("%d%d%d%d", &x, &y, &z, &k);
x = x - 1;
y = y - 1;
if (k)
map[x][y] = map[y][x] = 0;
else
map[x][y] = map[y][x] = z;
}
Prim(n);
}
return 0;
}