Run ID 作者 问题 语言 测评结果 分数 时间 内存 代码长度 提交时间
150290 李树强 牛的旅行 C++ 通过 100 3 MS 476 KB 1602 2024-06-01 17:53:45

Tests(9/9):


#include<iostream> #include<cmath> #include<string> #include<iomanip> using namespace std; const int N = 160, inf = 1e9; int n, x[N], y[N], fa[N]; bool g[N][N]; double f[N][N], maxdis[N], bkdis[N], ans = inf; string s; double dis(int a, int b){ return sqrt(pow(x[a] - x[b], 2) + pow(y[a] - y[b], 2)); } int find_root(int a){ if(fa[a] == a) return a; else return fa[a] = find_root(fa[a]); } void merge(int u, int v){ int ru = find_root(u), rv = find_root(v); fa[ru] = rv; } int main(){ for(int i = 0; i < N; i++) fa[i] = i; cin >> n; for(int i = 0; i < n; i++) cin >> x[i] >> y[i]; for(int i = 0; i < n; i++){ cin >> s; for(int j = 0; j < n; j++){ g[i][j] = (s[j] - '0'); if(g[i][j]) f[i][j] = dis(i, j); else if(i == j) f[i][j] = 0; else f[i][j] = inf; if(g[i][j]) merge(i, j); } } for(int k = 0; k < n; k++){ for(int i = 0; i < n; i++){ for(int j = 0; j < n; j++){ f[i][j] = min(f[i][j], f[i][k] + f[k][j]); } } } for(int i = 0; i < n; i++){ for(int j = 0; j < n; j++){ if(f[i][j] < inf-1) maxdis[i] = max(maxdis[i], f[i][j]); } } for(int i = 0; i < n; i++){ for(int j = 0; j < n; j++){ if(find_root(i) == find_root(j)){ bkdis[find_root(i)] = max(bkdis[find_root(i)], f[i][j]); } } } for(int i = 0; i < n; i++){ for(int j = 0; j < n; j++){ if(find_root(i) != find_root(j)){ ans = min(ans, max(bkdis[find_root(i)], max(bkdis[find_root(j)], dis(i, j) + maxdis[i] + maxdis[j]))); } } } cout << fixed << setprecision(6) << ans; return 0; }


测评信息: