解法
星の変な入力を頑張って5辺にしてDijkstra。
ソース
typedef pair< double , int > Pi;
bool used[100];
double info[100][100];
int n, m, l;
L stars[100][5];
void add( int x, int y, int a, int r, const int z){
G hosi(5);
for(int i = 0 ; i < 5 ; i++ ){
double theta = Degree_to_Radian(a + 72 * i);
double nx = r * sin( theta ), ny = r * cos( theta );
hosi[i] = P( x - nx, y + ny);
}
for(int i = 0 ; i < 5 ; i++ ){
stars[z][i] = L( hosi[i * 2 % 5], hosi[(i + 1) * 2 % 5]);
}
}
double dist( LLL a, LLL b){
double ret = INF;
for(int i = 0 ; i < a.size() ; i++ ){
for(int j = 0 ; j < b.size() ; j++ ){
ret = min( ret, distancion( a[i], b[i]));
}
}
return ret;
}
double Dijkstra(){
priority_queue< Pi , vector< Pi > , greater< Pi > > que;
fill_n( used, 100, false);
que.push( Pi( 0.0, m));
while(!que.empty()){
Pi p = que.top(); que.pop();
if(p.sc == l) return p.fr;
if(used[p.sc]++) continue;
for(int i = 0 ; i < n ; i++ )
que.push( Pi( info[p.sc][i] + p.fr, i));
}
}
int main(){
while(cin >> n >> m >> l, l){
m--, l--;
for(int i = 0 ; i < n ; i++ ){
int x, y, a, r;
cin >> x >> y >> a >> r;
add( x, y, a, r, i);
}
for(int i = 0 ; i < n ; i++ ){
for(int j = i + 1 ; j < n ; j++ ){
double dist = INF;
for(int a = 0 ; a < 5 ; a++ ){
for(int b = 0 ; b < 5 ; b++ ){
dist = min( dist, distancion( stars[i][a], stars[j][b]));
}
}
info[i][j] = info[j][i] = dist;
}
}
cout << fixed << setprecision(10) << Dijkstra() << endl;
}
}
0 件のコメント:
コメントを投稿