Time Limit: 1000MS | Memory Limit: 10000K | |
Total Submissions: 22796 | Accepted: 8967 |
Description
Input
Output
Sample Input
4 0 4 9 21 4 0 8 17 9 8 0 16 21 17 16 0
Sample Output
28
题目给出了n个农场之间的距离,先要让这n个农场全部覆盖网络,求所用网线的最小长度,典型的最小生成树问题,比较简单,因为是稠密图,可直接用Prim算法解,我提交1次就A了,详情见代码.
参考代码:
1 /*
2 Prim算法基本思想
3 1. 在图G=(V, E) (V表示顶点 ,E表示边)中,从集合V中任取一个顶点(例如取顶点v0)放入集合 U中,这时 U={v0},集合T(E)为空。
4 2. 从v0出发寻找与U中顶点相邻(另一顶点在V中)权值最小的边的另一顶点v1,并使v1加入U。即U={v0,v1 },同时将该边加入集合T(E)中。
5 3. 重复2,直到U=V为止。
6 这时T(E)中有n-1条边,T = (U, T(E))就是一棵最小生成树。
7 */
8 #include<iostream>
9 #include<cstdlib>
10 #include<cstdio>
11 #include<cstring>
12 #include<algorithm>
13 #include<cmath>
14 using namespace std;
15 int map[100][100];
16 int lowcost[100];
17 const int inf = (1<<20) ;
18 int main()
19 {
20 int n;
21 while ( cin >> n )
22 {
23 int i , j ;
24 for ( i = 0 ; i < n ; i ++ )
25 for ( j = 0 ; j < n ; j ++ )
26 cin >> map[i][j];
27 for ( i = 0 ; i < n ; i ++ )
28 lowcost[i]=map[0][i]; //初始化各点到集合的距离
29 int ans=0;//记录生成树的长度
30 for ( i = 0 ; i < n-1 ; i ++ )
31 {
32 int mindis=inf;
33 int minone;
34 for ( j = 0 ; j < n ; j ++ )
35 {//寻找到集合距离最近的点
36 if(lowcost[j]&&mindis>lowcost[j])
37 {
38 mindis=lowcost[j];
39 minone=j;
40 }
41 }
42 ans+=lowcost[minone];
43 lowcost[minone]=0;
44 for ( j = 0 ; j < n ; j ++ )
45 {//更新各点到集合的距离
46 if(lowcost[j]>map[minone][j])
47 lowcost[j]=map[minone][j];
48 }
49 }
50 cout<<ans<<endl;
51 }
52 return 0;
53 }