这题是厦门大学第一届程序设计大赛上的一题,这题我用的是prim算法.稍微有一点变形;
说实话,可能不和我说是最小生成树解法,我可能想不到,搞不好要去暴力..
虽然最后还是想出来了...其实不难..
将读入的每个城堡的分值读入,读入以后计算城堡i到城堡j的分值,平方并且记录.
最后将最小生成树改成最大生成树..随便叫= =反正是这个意思..
其实感觉有点像以前做过的一道DP题,不知道可不可行..hdu 的 搬寝室.
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
![](https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif)
1 #include <iostream> 2 #include <string.h> 3 using namespace std; 4 #define maxn 1005 5 #define INF 0x3f3f3f3f 6 int mincost[maxn],value[maxn]; 7 int cost[maxn][maxn]; 8 bool visit[maxn]; 9 int n; 10 int prim() 11 { 12 int res = 0, index = 1 , max_cost ; 13 for(int i = 1;i <= n;i++) 14 mincost[i] = cost[i][1]; 15 mincost[1] = 0; 16 memset(visit,false,sizeof(visit)); 17 visit[1] = true; 18 for(int i = 1 ; i <= n; i++) 19 { 20 max_cost = 0; 21 for(int j = 1; j <= n; j++) 22 { 23 if(mincost[j]>max_cost && !visit[j]) 24 { 25 max_cost = mincost[j]; 26 index = j; 27 } 28 } 29 visit[index] = true; 30 for(int k = 1; k <= n; k++) 31 { 32 if(!visit[k] && cost[k][index] > mincost[k]) 33 mincost[k] = cost[k][index] ; 34 35 } 36 37 } 38 for(int i = 1 ;i <=n;i++) 39 res += mincost[i]; 40 return res; 41 } 42 int main() 43 { 44 while(~scanf("%d",&n)) 45 { 46 memset(cost,0,sizeof(cost)); 47 for(int i = 1 ; i <= n ; i ++) 48 { 49 scanf("%d",&value[i]); 50 for(int j = 1 ; j <= i ;j++) 51 { 52 cost[i][j] = cost[j][i] = (value[i] - value[j])*(value[i]-value[j]); 53 } 54 } 55 printf("%d\n",prim()); 56 } 57 return 0 ; 58 }