题目大意:
描述
南阳理工学院要进行用电线路改造,现在校长要求设计师设计出一种布线方式,该布线方式需要满足以下条件:
1、把所有的楼都供上电。
1、把所有的楼都供上电。
2、所用电线花费最少
其实就是求最小生成树,通过这一题,也知道到了prim适合去解那些用邻接矩阵储存的题。而kruscal适合结点储存的处理,而且最小生成树和最短路问题差多不,都是dp问题吧,且最后的状态方程式 dis[j]<map[rac][j] 。。。而最短路是dis[j]<dis[rac] + map[rac][j]; 基本都理解了。。。。
#include<cstdio>
#include<cstdlib>
#include<iostream>
#include<algorithm>
#include<vector>
#include<cstring>
using namespace std;
#define INF 1000
int n, e, _max;
int map[505][505];
bool vis[505];
int dis[505];
int prim(int n,int e)
{
int u, v, w;
int sum = 0;
for(int i=0; i<=n; i++)
for(int j=0; j<=n; j++)
map[i][j] = INF;
for(int i=1; i<=e; i++)
{
scanf("%d %d %d",&u,&v,&w);
map[u][v] = map[v][u] = w;
}
for(int i=1;i<=n; i++)
{
scanf("%d",&w);
map[0][i] = map[i][0] = w;
}
memset(vis, false, sizeof(vis));
for(int i=1; i<=n; i++)
dis[i] = map[0][i];
vis[0] = true;
for(int i=1; i<=n; i++)
{
_max = INF; int rac;
for(int j =0; j<=n; j++)
if(!vis[j]&&dis[j]<_max)
{
_max = dis[j];
rac = j;
}
vis[rac] = true;
sum +=_max;
for(int j=0; j<=n; j++)
if(!vis[j]&&map[rac][j]<dis[j])
dis[j] = map[rac][j];
}
return sum;
}
int main()
{
int ncase;
scanf("%d",&ncase);
while(ncase--)
{
scanf("%d %d",&n, &e);
int lo = prim(n,e);
printf("%d\n",lo);
}
system("pause");
return 0;
}