HDU 1875 畅通工程再续

 

http://acm.hdu.edu.cn/showproblem.php?pid=1875

 

解题思路:还是用到prim算法啦,只不过这道题他没给你两点之间的权值,需要自己用for循环一个个求出i点到j点的距离,时间复杂度就是O(n^2)了,之后就是标准的prim算法做啦。

 

#include <stdio.h> #include <string.h> #include <math.h> #define INIT 999999999 #define MaxVertex 105 int NumOfVertex; int count; double sum; double Graph[MaxVertex][MaxVertex]; struct Point { int x; int y; }points[MaxVertex]; void Prim() { double distance[MaxVertex]; bool visited[MaxVertex]; sum = 0; memset(visited,0,sizeof(visited)); int i,j; double min; int locate; for (i=0;i<NumOfVertex;i++) distance[i] = Graph[0][i]; visited[0] = true; count = 1; for (j=0;j<NumOfVertex;j++) { min = INIT; for (i=1;i<NumOfVertex;i++) { if (!visited[i]&&distance[i]<min) { min = distance[i]; locate = i; } } if(min!=INIT) { count++; visited[locate] = true; sum+=min; for (i=0;i<NumOfVertex;i++) { if (!visited[i]&&distance[i]>Graph[locate][i]) { distance[i] = Graph[locate][i]; } } } } } double dist(Point a,Point b) { double k; k = sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y)); if (k<=1000&&k>=10) return k; return INIT; } int main() { int i,j; int NumOfTest; /*freopen("e://1.txt","r",stdin);*/ while (scanf("%d",&NumOfTest)!=EOF) { while (NumOfTest--) { scanf("%d",&NumOfVertex); for (i=0;i<NumOfVertex;i++) { for(j=0;j<NumOfVertex;j++) if(i==j) Graph[i][j] = 0; else Graph[i][j] = INIT; } for(i=0;i<NumOfVertex;i++) scanf("%d%d",&points[i].x,&points[i].y); for(i=0;i<NumOfVertex;i++) { for(j=0;j<NumOfVertex;j++) if(i!=j) Graph[i][j] = 100*(dist(points[i],points[j])); } Prim(); if (count == NumOfVertex) { printf("%0.1lf/n",sum); } else printf("oh!/n"); } } return 0; }

你可能感兴趣的:(算法,struct,Graph,distance)