hdu 1162 最小生成树
2015-04-09 16:01
141 查看
与1875类似,所以这里不再用kruskal而是用了prim。
1Y
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1162、
就是最普通的prim,只是权值变成了double型
1Y
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1162、
就是最普通的prim,只是权值变成了double型
#include <iostream> #include <cstdio> #include <cstring> #include <algorithm> #include <cmath> using namespace std; #define M 109 #define INF 0x3f3f3f3f double map[M][M]; double dis[M]; bool vis[M]; double ans; struct { double x,y; }point[M]; int n; void prim() { for(int i = 1;i <= n;i++) dis[i] = map[1][i]; vis[1] = true; for(int i = 2;i <= n;i++) { double min = INF; int k; for(int j = 1;j <= n;j++) { if(!vis[j] && dis[j]<min) { min = dis[j]; k = j; } } ans += min; vis[k] = true; for(int j = 1;j <= n;j++) { if(!vis[j] && dis[j]>map[k][j]) { dis[j] = map[k][j]; } } } } int main() { while(scanf("%d",&n)==1) { ans = 0; memset(vis,0,sizeof(vis)); //本题对于map来说并不需要进行初始化,因为每一个点之间都会读入一条路, for(int i = 1;i <= n;i++) { scanf("%lf %lf",&point[i].x,&point[i].y); } for(int i = 1;i <= n;i++) for(int j = i+1;j <= n;j++) { double temp = sqrt(fabs(point[i].x-point[j].x)*fabs(point[i].x-point[j].x)+fabs(point[i].y-point[j].y)*fabs(point[i].y-point[j].y)); map[i][j] = temp; map[j][i] = temp; } prim(); printf("%.2f\n",ans); } return 0; }
相关文章推荐
- HDU 1162 Eddy's picture(最小生成树)
- HDU 1162 最小生成树
- hdu 1162 Eddy's picture(最小生成树prim)
- hdu 1162 Eddy's picture(最小生成树之kruskal算法)
- Hdu 1162 Eddy's picture【最小生成树】
- hdu 1162 最小生成树(Kruskal)
- HDU-1875 畅通工程再续-1162 - Eddy's picture(最小生成树,Kruskal 算法实现 )
- hdu 1162 Eddy's picture (Kruskal算法,prim算法,最小生成树)
- hdu 1162 Eddy's picture(最小生成树算法)
- hdu 1162 Eddy's picture(最小生成树算法)
- HDU-1162(最小生成树)
- hdu1162 Eddy's picture(图论:最小生成树-minimal spanning tree)
- hdu 1162 Eddy's picture(最小生成树Prim算法)
- hdu 1162 Eddy's picture (Kruskal算法,prim算法,最小生成树)
- hdu 1162 Eddy's picture(最小生成树Kruskal)
- hdu 1162 Eddy's picture(最小生成树)
- hdu 1162 Eddy's picture(基础最小生成树)
- HDU 1162 (最小生成树)
- HDU1162-Eddy's picture-最小生成树(prim算法模板)
- hdu-1162-Eddy's picture(克鲁斯卡尔求最小生成树)