pku 2253 Frogger Prim算法巧用 解题报告
2010-03-24 12:06
435 查看
pku 2253 Frogger Prim算法巧用 解题报告
题意:给出一个有权无向图,求出一条生成树其权值最大值,但在所有的生成树下,其值是最小的.
算法:熟悉Prim算法的过程,那么就很好解决次问题.
AC代码:
#include <math.h>
#include <stdio.h>
#include <string.h>
#define M 205
const double MAX = 2000000;
int n, s, t;
int x[M], y[M];
double graph[M][M], ans;
void init()
{
int i, j;
for (i = 0; i < n; i++)
{
for (j = 0; j < n; j++)
{
graph[i][j] = ((x[i] - x[j]) * (x[i] - x[j]) + (y[i] - y[j]) * (y[i] - y[j]));
}
}
}
void prim(int father[])
{
double min[M];
int i, j, k, used[M];
for (i= 0; i < n; i++)
{
min[i] = MAX;
used[i] = 0;
father[i] = -1;
}
min[0] = 0;
for (j = 0; j < n; j++)
{
for (k = -1, i = 0; i < n; i++)
{
if (!used[i] && (k == -1 || min[i] < min[k]))
{
k = i;
}
}
used[k] = 1;
for (i = 0; i < n; i++)
{
if (!used[i] && graph[k][i] < min[i])
{
father[i] = k;
min[i] = graph[k][i];
}
}
}
}
int main()
{
freopen("frogger.in", "r", stdin);
int i, test = 1;
while (scanf("%d", &n), n)
{
for (i = 0; i < n; i++)
{
scanf("%d%d", &x[i], &y[i]);
}
init();
s = 0, t = 1;
int father[M];
printf("Scenario #%d/n", test++);
prim(father);
i = 1;
ans = 0;
while (1)
{
if (ans < graph[father[i]][i])
{
ans = graph[father[i]][i];
}
i = father[i];
if (i == 0)
{
break;
}
}
printf("Frog Distance = %.3lf/n/n", (float)sqrt(ans));
getchar();
}
return 0;
}
题意:给出一个有权无向图,求出一条生成树其权值最大值,但在所有的生成树下,其值是最小的.
算法:熟悉Prim算法的过程,那么就很好解决次问题.
AC代码:
#include <math.h>
#include <stdio.h>
#include <string.h>
#define M 205
const double MAX = 2000000;
int n, s, t;
int x[M], y[M];
double graph[M][M], ans;
void init()
{
int i, j;
for (i = 0; i < n; i++)
{
for (j = 0; j < n; j++)
{
graph[i][j] = ((x[i] - x[j]) * (x[i] - x[j]) + (y[i] - y[j]) * (y[i] - y[j]));
}
}
}
void prim(int father[])
{
double min[M];
int i, j, k, used[M];
for (i= 0; i < n; i++)
{
min[i] = MAX;
used[i] = 0;
father[i] = -1;
}
min[0] = 0;
for (j = 0; j < n; j++)
{
for (k = -1, i = 0; i < n; i++)
{
if (!used[i] && (k == -1 || min[i] < min[k]))
{
k = i;
}
}
used[k] = 1;
for (i = 0; i < n; i++)
{
if (!used[i] && graph[k][i] < min[i])
{
father[i] = k;
min[i] = graph[k][i];
}
}
}
}
int main()
{
freopen("frogger.in", "r", stdin);
int i, test = 1;
while (scanf("%d", &n), n)
{
for (i = 0; i < n; i++)
{
scanf("%d%d", &x[i], &y[i]);
}
init();
s = 0, t = 1;
int father[M];
printf("Scenario #%d/n", test++);
prim(father);
i = 1;
ans = 0;
while (1)
{
if (ans < graph[father[i]][i])
{
ans = graph[father[i]][i];
}
i = father[i];
if (i == 0)
{
break;
}
}
printf("Frog Distance = %.3lf/n/n", (float)sqrt(ans));
getchar();
}
return 0;
}
相关文章推荐
- POJ - 2253 Frogger解题报告
- Pku acm 2253 Frogger数据结构题目解题报告(六)—单源最短路径:Dijkstra算法
- POJ 2253 Frogger 解题报告
- pku 2421 Prim算法 Constructing Roads解题报告
- 2253 Frogger 解题报告
- pku 3748 位操作 解题报告
- pku 3753 根据关键字进行字符串拷贝 解题报告
- Flip and Shift -- ACM PKU 1063 解题报告
- pku 1001 高精度 Exponentiation 解题报告
- pku 2253 Frogger(Dijkstra+heap)
- pku 3621 01分数规划 sightseeing cows 解题报告
- pku 1947 Rebuilding Roads 树形dp 解题报告
- pku 1185 炮兵阵地 压缩dp 解题报告
- pku 3039 Margaritas on the River Walk 背包dp 解题报告
- pku 2392 space elevator 多重背包 dp 解题报告
- pku 1308 Is A Tree 搜索 解题报告
- pku 1141 Bracket Sequence DP 解题报告
- Guessing Game解题报告 (pku 2328)
- Pku acm 1953 World Cup Noise 动态规划题目解题报告(四)
- Pku acm 1887 Testing the CATCHER 动态规划题目解题报告(十一)