标签:
Input
The input includes several cases. For each case, the first line contains the number of farms, N (3 <= N <= 100). The following lines contain the N x N conectivity matrix, where each element shows the distance from on farm to another. Logically, they are N lines of N space-separated integers. Physically, they are limited in length to 80 characters, so some lines continue onto others. Of course, the diagonal will be 0, since the distance from farm i to itself is not interesting for this problem.
Output
For each case, output a single integer length that is the sum of the minimum length of fiber required to connect the entire set of farms.
Sample Input
421 17 16 0
28
题目大意:给你一个N个点的矩阵图,求所有点相连的最小生成树。
思路:直接裸的Prim算法。
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
using namespace std;
int G[110][110],vis[110],low[110];
void Prim(int N)
{
memset(vis,0,sizeof(vis));
int ans = 0;
int pos = 1;
vis[1] = 1;
for(int i = 1; i <= N; i++)
if(i != pos)
low[i] = G[pos][i];
for(int i = 1; i < N; i++)
{
int Min = 0xffffff0;
for(int j = 1; j <= N; j++)
{
if(!vis[j] && Min > low[j])
{
Min = low[j];
pos = j;
}
}
ans += Min;
vis[pos] = 1;
for(int j = 1; j <= N; j++)
{
if(!vis[j] && low[j] > G[pos][j])
low[j] = G[pos][j];
}
}
cout << ans << endl;
}
int main()
{
int N;
while(cin >> N)
{
for(int i = 1; i <= N; i++)
{
for(int j = 1; j <= N; j++)
{
cin >> G[i][j];
}
}
Prim(N);
}
}
标签:
原文地址:http://blog.csdn.net/lianai911/article/details/42124897