题意 : john当上了镇长,打算给每个农场都连接网络,需要用最小的成本连接其他所有农场,所以要找最少的纤维连在一起,任何两个农场之间的距离不超过十万。输入n,下面有n行n列,代表着每两个农场的距离,对角线为0,因为自己到自己是为0;
解题思路 : 这个题要包含所有的农场,赤果果的最小生成树,这个题的话,注意是多组输入还有数组不要开得太小,算法的话prim和kruskal都可以,我用的是prim。
1 #include2 #include 3 #include 4 #include 5 using namespace std; 6 int ans,dis[1001][1001]; 7 const int INF = 1<<29 ; 8 int vis[1001],n,low[1001]; 9 int prim()10 {11 memset(vis,0,sizeof(vis));12 int i,j,flag,min;13 ans = 0 ;14 for(i = 1 ; i <= n ; i++)15 {16 low[i] = dis[1][i];17 }18 vis[1] = 1 ;19 for(i = 1 ; i <= n ; i++)20 {21 min = INF;22 for(j = 1 ;j <= n ; j++)23 {24 if(min > low[j]&&!vis[j])25 {26 min = low[j] ;27 flag = j;28 }29 }30 if(min >= INF)31 {32 flag = -1 ;33 break ;34 }35 ans+=min ;36 vis[flag] = 1 ;37 for(j = 1 ; j <= n ; j++)38 {39 if(dis[flag][j] < low[j] && !vis[j])40 low[j] = dis[flag][j];41 }42 }43 return ans ;44 }45 int main()46 {47 while(~scanf("%d",&n))48 {49 for(int i = 1 ; i <= n ; i++)50 {51 for(int j = 1 ; j <= n ; j++)52 {53 cin>>dis[i][j] ;54 }55 }56 ans = prim();57 cout< <