知乐商城是什么网站,营销型网站建设答辩,网红网站建设官网,黔西县住房和城乡建设局网站前言 最近真的要紧张一点了#xff0c;马上就要进行蓝桥杯的比赛了#xff0c;这一阵子每天要养成刷题的习惯#xff0c;将蓝桥杯这个比赛当做考试来进行#xff0c;因为据我所知#xff0c;它的题型并不新颖和创新#xff0c;主要看对于算法的熟练程度和题型的熟练程度…前言最近真的要紧张一点了马上就要进行蓝桥杯的比赛了这一阵子每天要养成刷题的习惯将蓝桥杯这个比赛当做考试来进行因为据我所知它的题型并不新颖和创新主要看对于算法的熟练程度和题型的熟练程度所以加大题量加油。题目点这里代码#includeiostream #includecmath using namespace std; #define maxn 1002 #define edgeType double #define inf 1000000000.0 void initEdges(int n, edgeType graph[maxn][maxn]) {//建图 for (int i 0; i n; i) { for (int j 0; j n; j) { graph[i][j] (i j ? 0 : inf); } } } void addEdge(edgeType graph[maxn][maxn], int u, int v, edgeType w) {//确定边权 if (graph[u][v] w) { graph[u][v] w; } if (graph[v][u] w) { graph[v][u] w; } } edgeType prim(int n, edgeType graph[maxn][maxn]) { bool visited[maxn] { 0 };//记录dist对应索引的点到树的最小距离是否确定 edgeType dist[maxn];//存储每个点到最小生成树的最小距离 edgeType sum 0; for (int i 0; i n; i) {//i从0开始也不影响 dist[i] graph[0][i]; } visited[0] 1; while (1) { edgeType minDist inf; int minIndex -1; for (int i 0; i n; i) {//找到距离最小生成树最小的点 if (!visited[i] dist[i] minDist) { minDist dist[i]; minIndex i; } } if (minIndex -1) {//如果其余点到最小生成树的距离过大那么就没必要继续找了 break; } sum minDist; visited[minIndex] 1; for (int i 0; i n; i) {//对其余点到生成树的最小距离进行更新 if (!visited[i] dist[i] graph[i][minIndex]) { dist[i] graph[i][minIndex]; } } } for (int i 0; i n; i) {//判断生成树是否包含所有的点 if (!visited[i]) { return -1; } } return sum; } struct CZ { int x; int y; int h; }c[1001]; edgeType graph[maxn][maxn]; int main() { int n; cin n; initEdges(n, graph); for (int i 0; i n; i) { cin c[i].x c[i].y c[i].h; } for (int i 0; i n; i) { for (int j i1; j n; j) {//同一个点的距离为0这件事在函数内部已经设置过了这里用ji1 edgeType w sqrt((c[i].x - c[j].x) * (c[i].x - c[j].x) (c[i].y - c[j].y) * (c[i].y - c[j].y)) (c[i].h - c[j].h) * (c[i].h - c[j].h); addEdge(graph, i, j, w);//上面w的计算不需要加round这个四舍五入的函数多此一举看下面 } } printf(%.2lf, prim(n, graph));//这里的%.2lf本身就是四舍五入到两位小数 return 0; }这个题目在我学完这个prim算法以后发现这是一个非常简单和经典的模板题就是直接套公式加结合题目就能秒出来。首先把prim算法对应的模板代码写出来#includeiostream using namespace std; #define maxn 1002 #define edgeType double #define inf 1000000000.0 void initEdges(int n, edgeType graph[maxn][maxn]) {//建图 for (int i 0; i n; i) { for (int j 0; j n; j) { graph[i][j] (i j ? 0 : inf); } } } void addEdge(edgeType graph[maxn][maxn], int u, int v, edgeType w) {//确定边权 if (graph[u][v] w) { graph[u][v] w; } if (graph[v][u] w) { graph[v][u] w; } } edgeType prim(int n, edgeType graph[maxn][maxn]) { bool visited[maxn] { 0 };//记录dist对应索引的点到树的最小距离是否确定 edgeType dist[maxn];//存储每个点到最小生成树的最小距离 edgeType sum 0; for (int i 0; i n; i) {//i从0开始也不影响 dist[i] graph[0][i]; } visited[0] 1; while (1) { edgeType minDist inf; int minIndex -1; for (int i 0; i n; i) {//找到距离最小生成树最小的点 if (!visited[i] dist[i] minDist) { minDist dist[i]; minIndex i; } } if (minIndex -1) {//如果其余点到最小生成树的距离过大那么就没必要继续找了 break; } sum minDist; visited[minIndex] 1; for (int i 0; i n; i) {//对其余点到生成树的最小距离进行更新 if (!visited[i] dist[i] graph[i][minIndex]) { dist[i] graph[i][minIndex]; } } } for (int i 0; i n; i) {//判断生成树是否包含所有的点 if (!visited[i]) { return -1; } } return sum; }上面的宏定义根据题目换成相应的值。反思1.图对应的数组在初始化的函数内部就对相同点和不同点之间的距离做了大概的初始化所以在main函数的循环中不需要单独计算有些题目甚至可能出错2.对于输出语句中的printf(%.2lf, prim(n, graph));不仅仅只是代表保留两位小数它是由四舍五入到两位小数的。3.sqrt()是开方的函数需配合头文件cmath使用。