poj 2253 frogger

題目銜接: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++;
	}
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章