求助,为什么下载数据本地测AC,但洛谷测wa声一片
查看原帖
求助,为什么下载数据本地测AC,但洛谷测wa声一片
817044
cjwdyzxfblzs楼主2023/6/26 18:21

不理解,不理解,真的不理解

#include<bits/stdc++.h>
using namespace std;
inline int read()
{
    int x=0,f=1;char ch=getchar();
    while (ch<'0'||ch>'9'){if (ch=='-') f=-1;ch=getchar();}
    while (ch>='0'&&ch<='9'){x=x*10+ch-48;ch=getchar();}
    return x*f;
}
const int N = 1e5 + 1000, M = 160;
int n;
int X[N], Y[N];
int cnt, id[N];
double dist[M][M];
double mp[N], D[N];
inline double min(double a, double b) { return a < b ? a : b; }
inline double max(double a, double b) { return a > b ? a : b; }
double dis(int a, int b) 
{ 
    return sqrt (
                    (X[a] - X[b])   *   (X[a] - X[b]) 
                                    + 
                    (Y[a] - Y[b])   *   (Y[a] - Y[b])
                ); 
}
void dfs(int i)
{
    id[i] = cnt;
    for (int j = 1; j <= n; j ++ )
        if (!id[j] and dist[i][j] != 1e20) dfs(j);
}
signed main()
{
    // freopen("P1522_1.in", "r", stdin);
    n = read();
    for (int i = 1; i <= n; i ++ )
        X[i] = read(), Y[i] = read();
    for (int i = 1; i <= n; i ++ )
        for (int j = 1; j <= n; j ++ )
        {
            char ch; 
            while (ch = getchar(), ch == ' ' || ch == '\n');
            if (ch == '1' || i == j) dist[i][j] = dis(i, j);
            else dist[i][j] = 1e20;
        }
    for (int i = 1; i <= n; i ++ )
        if (!id[i])  { ++ cnt, dfs(i); }
    for (int k = 1; k <= n; k ++ )
        for (int i = 1; i <= n; i ++ )
            for (int j = 1; j <= n; j ++ )
                if (dist[i][k] + dist[k][j] < dist[i][j])
                    dist[i][j] = dist[i][k] + dist[k][j];
    for (int i = 1; i <= n; i ++ )
    {
        mp[i] = 0.0;
        for (int j = 1; j <= n; j ++ )
            if (dist[i][j] < 1e20) 
                mp[i] = max(mp[i], dist[i][j]);
        D[id[i]] = max(D[id[i]], mp[i]);
    }
    double min_d = 1e20, max_d;
    for (int i = 1; i <= n; i ++ )
        for (int j = i + 1; j <= n; j ++ )
            if (id[i] != id[j])
            {
                max_d = 
                    max(
                        max(D[id[i]], D[id[j]]),
                        mp[i] + dis(i, j) + mp[j]
                    );
                min_d = min(min_d, max_d);
            }
    // freopen("ans.out", "w", stdout);
    printf("%.6lf\n", min_d);
    // fclose(stdin); fclose(stdout);
    // if (system("fc ans.out P1522_1.out")) 
    //     cout << "WA" << endl;
    // else cout << "AC" << endl;
    return 0;   
}

2023/6/26 18:21
加载中...