P1522 牛的旅行
阿新 • • 發佈:2018-12-19
這題挺好……有幾個坑……(反正我都跳進去了)
對於新的更大的圖,由於求的是最小連線邊,所以它的值可能小於之前單獨一個圖的最長的最短路……
所以之後的值應該取個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; }