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
KEY:这题就是求最小生成树的问题;
Source:
#include < iostream >
#define MAX 100000
using namespace std;
int a[ 101 ][ 101 ];
int n;
int f[ 101 ];
int d[ 101 ];
void init()
... {
int i;
for(i=1;i<=n;i++)
...{
f[i]=0;
d[i]=MAX;
}
}
int find()
... {
int min=MAX,pos=1;
for(int i=1;i<=n;i++)
if(f[i]==0&&d[i]<min)
...{
min=d[i];
pos=i;
}
return pos;
}
int shortest()
... {
d[1]=0;
f[1]=1;
int v;
int i,j;
for(i=2;i<=n;i++)
...{
d[i]=a[1][i];
}
v=1;
for(i=2;i<=n;i++)
...{
v=find();
f[v]=1;
for(j=1;j<=n;j++)
...{
if(f[j]==0&&d[j]>a[v][j])
d[j]=a[v][j];
}
}
int sum=0;
for(i=1;i<=n;i++)
sum+=d[i];
return sum;
}
void input()
... {
int i,j;
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
cin>>a[i][j];
}
int main()
... {
// freopen("fjnu_1427.in","r",stdin);
int N;
cin>>N;
for(int i=1;i<=N;i++)
...{
cin>>n;
init();
input();
cout<<shortest()<<endl;
}
return 0;
}
#include < iostream >
#define MAX 100000
using namespace std;
int a[ 101 ][ 101 ];
int n;
int f[ 101 ];
int d[ 101 ];
void init()
... {
int i;
for(i=1;i<=n;i++)
...{
f[i]=0;
d[i]=MAX;
}
}
int find()
... {
int min=MAX,pos=1;
for(int i=1;i<=n;i++)
if(f[i]==0&&d[i]<min)
...{
min=d[i];
pos=i;
}
return pos;
}
int shortest()
... {
d[1]=0;
f[1]=1;
int v;
int i,j;
for(i=2;i<=n;i++)
...{
d[i]=a[1][i];
}
v=1;
for(i=2;i<=n;i++)
...{
v=find();
f[v]=1;
for(j=1;j<=n;j++)
...{
if(f[j]==0&&d[j]>a[v][j])
d[j]=a[v][j];
}
}
int sum=0;
for(i=1;i<=n;i++)
sum+=d[i];
return sum;
}
void input()
... {
int i,j;
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
cin>>a[i][j];
}
int main()
... {
// freopen("fjnu_1427.in","r",stdin);
int N;
cin>>N;
for(int i=1;i<=N;i++)
...{
cin>>n;
init();
input();
cout<<shortest()<<endl;
}
return 0;
}