algorithm_2024/src/P1522/P1522.cpp

103 lines
2.8 KiB
C++
Raw Normal View History

2024-10-09 14:12:47 +00:00
#define NDEBUG
2024-10-09 14:42:38 +00:00
#include <algorithm>
2024-10-09 13:56:57 +00:00
#include <cmath>
2024-10-09 14:10:30 +00:00
#include <iomanip>
2024-10-09 13:56:57 +00:00
#include <iostream>
#include <limits>
#include <string>
#define NV(v)#v<<" : "<<(v)
2024-10-09 14:12:47 +00:00
#ifdef NDEBUG
#define DEBUG(code)
#else
#define DEBUG(code){code}
#endif
2024-10-09 13:56:57 +00:00
using ull = unsigned long long;
const size_t max_n = 150+5;
struct Point{
ull x,y;
};
ull n;
Point points[max_n];
std::string s;
double mtx_len[max_n][max_n];
double max_len[max_n];
2024-10-10 11:32:01 +00:00
const double double_max = std::numeric_limits<double>::max(), double_min = std::numeric_limits<double>::min();
2024-10-10 11:58:30 +00:00
double min_ans {double_max}, default_ans{0};
2024-10-09 13:56:57 +00:00
double len(const Point &p1, const Point &p2){
return std::sqrt(
std::pow((double)p1.x-(double)p2.x, (double)2)+
std::pow((double)p1.y-(double)p2.y,(double)2)
);
}
int main(){
// std::cout<<INF<<'\n';
std::cin>>n;
for(ull i = 1;i<=n;i++){
std::cin>>points[i].x>>points[i].y;
}
for(ull i=1;i<=n;i++){
std::cin>>s;
for(ull j=1;j<=n;j++){
2024-10-09 14:10:30 +00:00
if(i==j){
continue;
}
2024-10-09 13:56:57 +00:00
if(s[j-1]=='1'){
mtx_len[i][j] = len(points[i],points[j]);
}else{
2024-10-10 11:32:01 +00:00
mtx_len[i][j] = double_max;
2024-10-09 13:56:57 +00:00
}
}
}
for(ull k=1;k<=n;k++){
for(ull i=1;i<=n;i++){
for(ull j=1;j<=n;j++){
double new_len;
2024-10-10 11:32:01 +00:00
if(mtx_len[i][k]!=double_max && mtx_len[k][j]!=double_max){
2024-10-09 13:56:57 +00:00
new_len = mtx_len[i][k]+mtx_len[k][j];
}else{
continue;
}
if(new_len<mtx_len[i][j]){
mtx_len[i][j] = new_len;
}
2024-10-09 14:42:38 +00:00
2024-10-09 13:56:57 +00:00
}
}
}
for(ull i=1;i<=n;i++){
2024-10-10 11:32:01 +00:00
max_len[i]=double_max;
2024-10-09 13:56:57 +00:00
for(ull j=1;j<=n;j++){
2024-10-10 11:32:01 +00:00
if(mtx_len[i][j]==double_max)continue;
max_len[i] = std::max(mtx_len[i][j],(max_len[i]==double_max?double_min:max_len[i]));
2024-10-10 11:58:30 +00:00
default_ans = std::max(default_ans,max_len[i]);
2024-10-09 13:56:57 +00:00
}
}
2024-10-09 14:12:47 +00:00
DEBUG(
std::cout<<NV(min_ans)<<"\n---start\n";
)
2024-10-09 13:56:57 +00:00
for(ull i=1;i<=n;i++){
for(ull j=i+1;j<=n;j++){
2024-10-10 11:32:01 +00:00
if(mtx_len[i][j]==double_max){
2024-10-09 14:12:47 +00:00
DEBUG(
std::cout<<NV(i)<<'\n'<<NV(j)<<'\n'<<NV(max_len[i])<<'\n'<<NV(max_len[j])<<'\n'
<<NV(len(points[i], points[j]))<<'\n'<<NV(max_len[i]+ len(points[i], points[j]) + max_len[j])<<'\n';
)
2024-10-09 13:56:57 +00:00
min_ans = std::min(max_len[i]+ len(points[i], points[j]) +max_len[j],min_ans);
2024-10-09 14:12:47 +00:00
DEBUG(
std::cout<<NV(min_ans)<<'\n';
std::cout<<"---\n";
)
2024-10-09 13:56:57 +00:00
}
}
}
2024-10-10 11:58:30 +00:00
std::cout<<std::fixed<<std::setprecision(6)<<(min_ans==double_max?default_ans:std::max(default_ans, min_ans))<<'\n';
2024-10-09 13:56:57 +00:00
}