3 0 990 692 990 0 179 692 179 0 1 1 2
179
最小生成树 Prime算法:首先有两个集合V{},边的集合E{}。先选择一个点,加入到V集合中,然后选择和这个V集合中的点相关连的边中最小的,将边的另一头的点加入到V集合中,该边加入到E集合中,V集合中的点是一个连通图,每次找和这个连通图相连的最短边,来更新。
AC代码:
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int N = 105;
const int INF = 0xffffff;
int map[N][N], n;
int vis[N*(N+1)/2];
int dis[N*(N+1)/2];
void prim()
{
int i, j, t;
memset(vis, 0, sizeof(vis));
for(i=1; i<=n; i++)
dis[i]=map[1][i];
int loc, sum=0;
for(i=1; i<=n; i++)
{
int min = INF;
for(j=1; j<=n; j++)
{
if(!vis[j] && dis[j]<min)
{
min = dis[j];
loc = j;
}
}
vis[loc] = 1;
sum += min;
for(j=1; j<=n; j++)
if(!vis[j] && map[loc][j]<dis[j])
dis[j] = map[loc][j];
}
printf("%d\n", sum);
}
int main()
{
while(scanf("%d",&n) != EOF)
{
for(int i=1; i<=n; i++)
for(int j=1; j<=n; j++)
scanf("%d", &map[i][j]);
int q, a, b;
scanf("%d", &q);
for(int i=0; i<q; i++)
{
scanf("%d %d", &a, &b);
map[a][b] = map[b][a] = 0;
}
prim();
}
return 0;
}
HDU - 1102 - Constructing Roads (最小生成树--prim算法!!)
原文:http://blog.csdn.net/u014355480/article/details/42266891