[c++]代码库
#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) 回复
??
回复评论