- 分析:对节点间关系进行分析,可以发现,从Freddy到Fiona节点的每次跳跃都是在寻找最短路径,这和prim算法生成最小生成树的方法是一致的.所以可以直接在prim算法上求解答案.
首先看下prim模板
int cost[INF][INF];//边
int used[INF];
int mincost[INF];//已参与生成的所有节点到节点v的最小值
int v;
int prim()
{
for (int i = 0; i < V; i += 1){
mincost[i] = INF;
used[i] = false;
}
mincost[0] = 0;
int res = 0;
while (1){
int v = -1;
//从不属于X的顶点中找到从X到其权值最小的顶点
for (int i = 0; i < V; i += 1){
if(!used[i] && (v == -1 || mincost[i] < mincost[v]))
v = i;
}
if(v == -1) break;
used[v] = true;
res += mincost[v];
//在此顶点基础上对X到其他顶点的最小值进行更新
for (int i = 0; i < V; i += 1){
mincost[j] = min(mincost[j],cost[v][j]);
}
}
return res;
}
简单变动下就可以求出答案
/*
* Filename: code.cpp
* Created: 2017-10-03
* Author: wyl6
*[mail:17744454343@163.com]
* Desciption: Desciption
*/
#include <cstdio>
#include <cstdlib>
#include <iostream>
#include <stack>
#include <queue>
#include <algorithm>
#include <cstring>
#include <string>
#include <cmath>
#include <vector>
#include <bitset>
#include <list>
#include <sstream>
#include <set>
#include <functional>
using namespace std;
#define INF 0x3f3f3f3f
#define MAX 100
typedef long long ll;
int n;
double x[205];
double y[205];
double d[205][205];
double mind[205];
bool used[205];
int times = 0;
void prim()
{
for (int i = 0; i < n; i += 1){
used[i] = false;
mind[i] = INF;
}
mind[0] = 0;
double ans = 0;
while (1){
int u = -1;
for (int i = 0; i < n; i += 1)
if (!used[i] && (u == -1 || mind[i] < mind[u]))
u = i;
//以下是灵活变动部分
if(u == -1) break;
ans = max(ans,mind[u]);
used[u] = true;
if(u == 1) break;
for (int i = 0; i < n; i += 1)
mind[i] = min(mind[i],d[u][i]);
}
printf("Scenario #%d\nFrog Distance = %.3lf\n\n",times,ans);
}
int main()
{
while (cin >> n,n){
times++;
memset(d,INF,sizeof(d));
for (int i = 0; i < n; i += 1)
cin >> x[i] >> y[i];
for (int i = 0; i < n; i += 1)
for (int j = 0; j < n; j += 1)
d[i][j] = sqrt(pow(x[i]-x[j],2)+pow(y[i]-y[j],2));
prim();
}
return 0;
}