題目銜接:http://poj.org/problem?id=2253
題解:求出圖中兩點所有路徑中權值最大數中的最小值,即可簡化爲求最小生成樹中的距離最大值
AC代碼:
Memory: 584K Time: 16MS
Language: C++ Result: Accepted
#include <iostream>
#include <stack>
#include <cstring>
#include <cmath>
#include <set>
#include <cstdio>
using namespace std;
#define maxn 210
#define max 1000000
typedef struct stone{
int x;
int y;
}stone;
stone data[maxn];
double dis[maxn][maxn];
bool is_in_set[maxn];
int main()
{
int stones,cases=1;
while(cin>>stones && stones){
memset(data,0,sizeof(data));
memset(is_in_set,false,sizeof(is_in_set));
int n = stones;
stone start,end,temp;
cin>>start.x>>start.y;
cin>>end.x>>end.y;
n -= 2;
data[0] = start;
data[1] = end;
int i=2;
while(n){
cin>>temp.x>>temp.y;
data[i] = temp;
i++,n--;
}
for(int i=0;i<stones;i++){ //計算每兩個節點之間的距離
int a,b,c,d;
a = data[i].x,b = data[i].y;
for(int j=0;j<stones;j++){
c = data[j].x,d = data[j].y;
dis[i][j] = sqrt(double((a-c)*(a-c)+(b-d)*(b-d)));
}
}
set<int> jumped;
double max_jump;
max_jump = 0;
is_in_set[0] = true;
jumped.insert(0);
int start_node,next_node;
while(1){
set<int>::iterator set_it = jumped.begin();
double min = 1<<20;
while(set_it != jumped.end()){ //尋找下一個離集合最近的點
for(int i=0;i<stones;i++){
if( !is_in_set[i] && dis[*set_it][i] < min){
start_node = *set_it;
min = dis[*set_it][i];
next_node = i;
}
}
set_it++;
}
is_in_set[next_node] = true;
jumped.insert(next_node);
if( dis[start_node][next_node] > max_jump )
max_jump = dis[start_node][next_node];
if(next_node == 1) //到達目的節點,退出循環
break;
}
printf("Scenario #%d\nFrog Distance = %.3f\n\n",cases,max_jump);
cases++;
}
}