HDU 1162 (最小生成树)
2014-06-03 13:02
183 查看
WA了多次的代码:
改正之后AC的代码:
#include <cstdio> #include <cstring> #include <cmath> #define INF 0xfffffff double map[102][102],lowcost[102]; bool visited[102]; struct Point { double x,y; }point[102]; double distance (Point a,Point b){ return sqrt ((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y)); } //----普利姆算法 double Prim (int n){ int k; memset (visited,0,sizeof (visited)); visited[1] = true; double tmp,sum=0; for (int i=1;i<=n;i++) lowcost[i] = map[1][i]; for (int i=2;i<=n;i++){ tmp = INF; for (int j=1;j<=n;j++) if (!visited[j] && lowcost[j] < tmp) tmp = lowcost[k=j]; // printf ("tmp=%.2lf\n",tmp); if (tmp == INF) break; visited[k] = true; sum += tmp; for (int i=1;i<=n;i++) if (!visited[i] && map[k][i] < lowcost[i]) lowcost[i] = map[k][i]; } return sum; } int main (){ #ifndef ONLINE_JUDGE freopen ("in.txt","r",stdin); #endif int n; while (~scanf ("%d",&n)){ //----初始化map for (int i=1;i<=n;i++) for (int j=1;j<=n;j++) map[i][j] = INF; //----输入坐标点 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 tmp = distance (point[i],point[j]); // printf ("dis==%.2lf\n",tmp); map[i][j] = tmp; //---错误1.得到了 i 到 j 的距离,没有给出 j 到 i 的距离。实际是:map[i][j] = map[j][i] = tmp; } printf ("%.2lf\n",Prim(n)); } return 0; }
改正之后AC的代码:
#include <cstdio> #include <cstring> #include <cmath> #define INF 0xfffffff double map[102][102],lowcost[102]; bool visited[102]; struct Point { double x,y; }point[102]; double distance (Point a,Point b){ return sqrt ((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y)); } //----普利姆算法 double Prim (int n){ int k; memset (visited,0,sizeof (visited)); visited[1] = true; double tmp,sum=0; for (int i=1;i<=n;i++) lowcost[i] = map[1][i]; for (int i=2;i<=n;i++){ tmp = INF; for (int j=1;j<=n;j++) if (!visited[j] && lowcost[j] < tmp) tmp = lowcost[k=j]; // printf ("tmp=%.2lf\n",tmp); if (tmp == INF) break; visited[k] = true; sum += tmp; for (int i=1;i<=n;i++) if (!visited[i] && map[k][i] < lowcost[i]) lowcost[i] = map[k][i]; } return sum; } int main (){ #ifndef ONLINE_JUDGE freopen ("in.txt","r",stdin); #endif int n; while (~scanf ("%d",&n)){ //----初始化map for (int i=1;i<=n;i++) for (int j=1;j<=n;j++) map[i][j] = INF; //----输入坐标点 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 tmp = distance (point[i],point[j]); // printf ("dis==%.2lf\n",tmp); map[i][j] = map[j][i] = tmp; } printf ("%.2lf\n",Prim(n)); } return 0; }
相关文章推荐
- HDU 1162 Eddy's picture(最小生成树)
- HDU 1162 最小生成树
- hdu 1162 最小生成树
- hdu 1162 Eddy's picture(最小生成树之kruskal算法)
- Hdu 1162 Eddy's picture【最小生成树】
- hdu 1162 最小生成树(Kruskal)
- 最小生成树——— 克鲁斯卡尔 hdu 1162 Eddy's picture
- hdu 1162 Eddy's picture (Kruskal算法,prim算法,最小生成树)
- HDU 1162 Eddy's picture 最小生成树
- hdu 1162 Eddy's picture(最小生成树算法)
- HDU-1162(最小生成树)
- HDU 1162 Eddy's picture(最小生成树)
- 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(基础最小生成树)
- hdu1162 Eddy's picture(图论:最小生成树-minimal spanning tree)
- HDU1162-Eddy's picture-最小生成树(prim算法模板)
- hdu-1162-Eddy's picture(克鲁斯卡尔求最小生成树)