#include<bits/stdc++.h> |
using namespace std; |
int Dist[200], TF[200], M[200][200]; |
int Prime( int N) |
{ |
int sum = 0, i, j; |
for ( i = 2 ; i <= N; i ++) |
{ |
Dist[i] = M[1][i]; |
TF[i] = 0; |
} |
TF[1] = 1; |
Dist[1] = 0; |
for (i = 1; i < N; i ++) |
{ |
int min = 9999, k = -1; //找与顶点1相邻的最小的权值,k用来记最小值得下标 |
for (j = 1; j <= N; j ++) |
{ |
if (Dist[j] < min && !TF[j]) |
{ |
min = Dist[j]; |
k = j; |
} |
} |
TF[k] = true ; //记录该顶点已经可以到达 |
if (k != -1) //找到了最小的权值 |
{ |
sum += Dist[k]; //加入成本 |
for ( j = 1; j <= N; j ++) //从最新的顶点出发,刷新新的权值,继续找下一个最小的权值 |
{ |
if (Dist[j] > M[k][j] && !TF[j]) |
Dist[j] = M[k][j]; |
} |
} |
} |
return sum; |
} |
int main() |
{ |
int N, i, j; |
cin>>N; |
for ( i = 1; i <= N; i ++) |
for ( j = 1; j <= N; j ++) |
M[i][j] = 9999; //首先所有的边都初始化为无穷大 |
for ( i = 1; i <= N*(N-1)/2 ; i ++) //按行输入,以邻接矩阵形式存储 |
{ |
int a, b, c, d; |
cin>>a>>b>>c>>d; |
if ( d == 1 ) //若已修建该道路,则该道路权值定为0 |
M[a][b] = M[b][a] = 0; |
else //否则,权值定为修建该道路的成本 |
M[a][b] = M[b][a] = c; |
} |
cout<<Prime(N); |
return 0; |
} |
by: 发表于:2017-12-13 10:32:40 顶(0) | 踩(0) 回复
??
回复评论