标签:
kicc
题目大意:先给你N个村庄之间距离,用矩阵表示。再告诉你S个已经建好的路。
求再建多少距离的路,能实现N个村庄全部联通。
思路:用Prim算法来求最小生成树,已经建好的路就看做是路连接的两个村庄
之间距离为0。图建好后直接用Prim模板就可以了。
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
using namespace std;
int Map[110][110],vis[110],low[110];
void Prim(int N)
{
memset(vis,0,sizeof(vis));
int ans = 0;
vis[1] = 1;
int pos = 1;
for(int i = 1; i <= N; ++i)
if(i != pos)
low[i] = Map[pos][i];
for(int i = 1; i < N; ++i)
{
int Min = 0xffffff0;
for(int j = 1; j <= N; ++j)
{
if(!vis[j] && low[j] < Min)
{
Min = low[j];
pos = j;
}
}
ans += Min;
vis[pos] = 1;
for(int j = 1; j <= N; ++j)
if(!vis[j] && low[j] > Map[pos][j])
low[j] = Map[pos][j];
}
printf("%d\n",ans);
}
int main()
{
int N,S,a,b;
while(cin >> N)
{
for(int i = 1; i <= N; ++i)
for(int j = 1; j <= N; ++j)
cin >> Map[i][j];
cin >> S;
for(int i = 1; i <= S; ++i)
{
cin >> a >> b;
Map[a][b] = Map[b][a] = 0;
}
Prim(N);
}
return 0;
}
HDU1102 Constructing Roads【Prim】
标签:
原文地址:http://blog.csdn.net/lianai911/article/details/42365623