题意: john当上了镇长,打算给每个农场都连接网络,需要用最小的成本连接其他所有农场,所以要找最少的纤维连在一起,任何两个农场之间的距离不超过十万。输入n,下面有n行n列,代表着每两个农场的距离,对角线为0,因为自己到自己是为0;
分析:直接暴力连接,任选一个起点,每次搜索与起点相距最小的点,然后把上一次的终点再作为起点,直到全部连接。
收获: 这样的连接方式肯定要是链状的,本来想的是从第一个点开始寻找相距最小的点连接,直到最后一个点(显然成不了链,好傻啊啊啊啊)
看了别人的之后
AC:
#include<iostream>
#include <cstring>
using namespace std;
int main()
{
int dis[101][101],lock[101],n,i,j,min,finded,p,s;
while(cin>>n&&n)
{
memset(lock,0,sizeof(lock));
for(i=0; i<n; i++)
for(j=0; j<n; j++)
cin>>dis[i][j];
lock[0]=1;
finded=1;
s=0;
while(finded!=n)
{
min=100000000;
for(i=0; i<n; i++)
{
if(lock[i]!=1) continue;
for(j=0; j<n; j++)
{
if(lock[j]==0)
if(dis[i][j]<min)
{
min=dis[i][j];
p=j;
}
}
}
s+=min;
lock[p]=1;
finded++;
}
cout<<s<<endl;
}
return 0;
}