牛的旅行 Cow Tours
2017-08-11 17:34
225 查看
P1522 牛的旅行 Cow Tours
题目概述:有的路径连接一些特定的牧区。一片所有连通的牧区称为一个牧场。但是就目前而言,你能看到至少有两个牧区通过任何路径都不连通。在牧场里添加一条路径(注意,恰好一条)。对这条路径有以下限制:一个牧场的直径就是牧场中最远的两个牧区的距离(本题中所提到的所有距离指的都是最短的距离)。请编程找出一条连接两个不同牧场的路径,使得连上这条路径后,这个更大的新牧场有最小的直径。输出在所有牧场中最小的可能的直径。
数据规模:N (1 <= N <= 150),X,Y (0 <= X ,Y<= 100000)
思路:这个题首先要预处理距离,用勾股定理,然后考虑到N的值比较小(事实上小于300就可以了),我们考虑用O(N^3)的Floyd算法,然后如果暴力枚举一次就是O(N^2)*O(N^3)的时间,就算N再小也不能用这种算法,所以考虑是求一个最值,所以用最大值来记录,这样时间变为O(N^2),就可以过了。
代码:
题目概述:有的路径连接一些特定的牧区。一片所有连通的牧区称为一个牧场。但是就目前而言,你能看到至少有两个牧区通过任何路径都不连通。在牧场里添加一条路径(注意,恰好一条)。对这条路径有以下限制:一个牧场的直径就是牧场中最远的两个牧区的距离(本题中所提到的所有距离指的都是最短的距离)。请编程找出一条连接两个不同牧场的路径,使得连上这条路径后,这个更大的新牧场有最小的直径。输出在所有牧场中最小的可能的直径。
数据规模:N (1 <= N <= 150),X,Y (0 <= X ,Y<= 100000)
思路:这个题首先要预处理距离,用勾股定理,然后考虑到N的值比较小(事实上小于300就可以了),我们考虑用O(N^3)的Floyd算法,然后如果暴力枚举一次就是O(N^2)*O(N^3)的时间,就算N再小也不能用这种算法,所以考虑是求一个最值,所以用最大值来记录,这样时间变为O(N^2),就可以过了。
代码:
#include<iostream> #include<algorithm> #include<cstdio> #include<cstring> #include<cmath> using namespace std; int x[155],y[155]; double a[155][155]; int temp; int i,j,k,n,t,m; double maxx,minn=10000000000; int b[155]; double c[155][155]; int rr() { int ans=0,f=1; char ch=getchar(); while(ch<'0'||ch>'9') { if(ch=='-') f=-1; ch=getchar(); } while(ch>='0'&&ch<='9') { ans*=10; ans+=ch-'0'; ch=getchar(); } return ans*f; } double dis(int xx,int yy) { return sqrt((x[xx]-x[yy])*(x[xx]-x[yy]) +(y[xx]-y[yy])*(y[xx]-y[yy])); } void solve() { for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) { for(int k=1;k<=n;k++) { if(a[i][j]>a[i][k]+a[k][j]) a[i][j]=a[i][k]+a[k][j]; } } for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) { for(int k=1;k<=n;k++) { if(a[i][j]>a[i][k]+a[k][j]) a[i][j]=a[i][k]+a[k][j]; } } for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) if(a[i][j]!=1000000000) maxx=max(maxx,a[i][j]); for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) a[i][j]=c[i][j]; } int main() { n=rr(); for(i=1;i<=n;i++) for(j=1;j<=n;j++) a[i][j]=1000000000; char ch; for(i=1;i<=n;i++) x[i]=rr(),y[i]=rr(); for(i=1;i<=n;i++) for(j=1;j<=n;j++) { cin>>ch; if(ch=='1') a[i][j]=a[j][i]=dis(i,j); } for(i=1;i<=n;i++) a[i][i]=0; for(i=1;i<=n;i++) for(j=1;j<=n;j++) for(k=1;k<=n;k++) { if(a[i][j]>a[i][k]+a[k][j]) a[i][j]=a[i][k]+a[k][j]; } for(i=1;i<=n;i++) for(j=1;j<=n;j++) c[i][j]=a[j][i]; for(int i=1;i<=n;i++) for(int j=1;j<i;j++) { if(a[i][j]==1000000000) { maxx=0; a[i][j]=a[j][i]=dis(i,j); solve(); minn=min(minn,maxx); a[i][j]=a[j][i]=1000000000; } } printf("%.6f",minn); return 0; } /* */
相关文章推荐
- 洛谷P1522 牛的旅行 Cow Tours
- 【最短路径】洛谷 P1522 牛的旅行 Cow Tours
- 洛谷 P1522 牛的旅行 Cow Tours
- 洛谷 P1522 牛的旅行 Cow Tours(Floyd, 并查集)
- usaco Cow Tours 牛的旅行
- 洛谷P1522 牛的旅行 Cow Tours
- Luogu P1522 牛的旅行 Cow Tours___floyd
- USACO 牛的旅行 Cow Tours
- USACO 2.4 cow tours奶牛的旅行
- 洛谷 P1522 牛的旅行 Cow Tours
- BZOJ 3091 城市旅行 Link-Cut-Tree
- hdu2066——一个人的旅行
- BZOJ 3531 SDOI2014 旅行 树链剖分
- 一场说走就走的旅行
- HDU 2066 一个人的旅行
- 【NOIP2012】开车旅行
- 一次心路的旅行,DAY3
- 【末世旅行之Kinect】在VS找不到Microsoft.Research.Kinect这个dll
- 超越光速:时间旅行不是梦
- 五一,期待一场这样的旅行,提前预祝Csdner五一快乐