Description
农民约翰被选为他们镇的镇长!
他其中一个竞选承诺就是在镇上建立起互联网,并连接到所有的农场。当然,他需要你的帮助。
约翰已经给他的农场安排了一条高速的网络线路,他想把这条线路共享给其他农场。 为了用最小的消费,他想铺设最短的光纤去连接所有的农场。
你将得到一份各农场之间连接费用的列表,你必须找出能连接所有农场并所用光纤最短的方案。
Input
该题含有多组测试数据。
第一行为M表示有M组测试数据。
每组数据第一行为农场的个数,N(3<=N<=100)。
接下去为一个N*N的矩阵,表示每个农场之间的距离。(农场之间的距离小于100000)
Output
每组数据只有一个输出,其中包含连接到每个农场的光纤的最小长度。
Sample Input
1 4 0 4 9 21 4 0 8 17 9 8 0 16 21 17 16 0
Sample Output
28
Source
usaco & 数据结构与算法设计 P89
#include
#include
#include
#include
#include
#include
#include
#define mx 1<<30
#define mxn 100+10
#define loc
using namespace std;
int m,n;
int mp[mxn][mxn];
int ds[mxn];
int nc[mxn];
int prim()
{
ds[1]=0;
for (int i=2;i<=n;++i)
{
ds[i]=mp[1][i];
nc[i]=1;
}
int tot=0;
for (int i=1;i<=n-1;++i)
{
int min=mx,nd=0;
for (int j=1;j<=n;++j)
if (ds[j]&&min>ds[j])
{
min=ds[j];
nd=j;
}
if (!nd) break;
tot+=min;
ds[nd]=0;
for (int j=1;j<=n;++j)
if (ds[j]&&ds[j]>mp[nd][j])
{
ds[j]=mp[nd][j];
nc[j]=nd;
}
}
return tot;
}
int main()
{
#ifdef loc
freopen("bulid.in","r",stdin);
freopen("bulid.out","w",stdout);
#endif
scanf("%d",&m);
for (int i=1;i<=m;++i)
{
scanf("%d",&n);
for (int j=1;j<=n;++j)
for (int k=1;k<=n;++k)
{
scanf("%d",&mp[j][k]);
if (!mp[j][k]) mp[j][k]=mx;
}
printf("%d\n",prim());
}
return 0;
}