1. 程式人生 > >P1522 牛的旅行

P1522 牛的旅行

  這題挺好……有幾個坑……(反正我都跳進去了)

  對於新的更大的圖,由於求的是最小連線邊,所以它的值可能小於之前單獨一個圖的最長的最短路……

  所以之後的值應該取個max(emmm……)

  所以第一次我只拿了70。。。

  而且還有一個小問題……注意Floyd。。。(自己想)

  程式碼:

#include<cstdio>
#include<iostream>
#include<cmath>
using namespace std;
#define maxn 200
#define inf 99999999.0
struct node
{
    
int x,y; } a[maxn]; int n; double dis[maxn][maxn],la[maxn],ro[maxn],ans=inf,now; double Dis(int i,int j) { return sqrt(pow(a[i].x-a[j].x,2)+pow(a[i].y-a[j].y,2)); } int main() { scanf("%d",&n); for(int i=1;i<=n;i++) scanf("%d%d",&a[i].x,&a[i].y); for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++) { int op; scanf("%1d",&op); if(i==j) continue; if(op==1) dis[i][j]=Dis(i,j); else dis[i][j]=inf; } for(int k=1;k<=n;k++) for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) dis[i][j]=min(dis[i][j],dis[i][k]+dis[k][j]);
for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) { if(dis[i][j]==inf) continue; la[i]=max(la[i],dis[i][j]); now=max(now,la[i]); } for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) if(dis[i][j]==inf) ans=min(ans,la[i]+la[j]+Dis(i,j)); printf("%.6lf",max(now,ans)); return 0; }