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; }