其他分享
首页 > 其他分享> > 1343:【例4-2】牛的旅行

1343:【例4-2】牛的旅行

作者:互联网

牛的旅行

注意事项:
- 枚举所有连接两个牧场的路径并找出其中的最短路径,最后别忘了跟单个牧场的直径相比较
- 用scanf("%c",&c)替换cin>>c只能拿20分,别问我为什么,我不知道(灬ꈍ ꈍ灬)

#include<iostream>
#include<cstring>
#include<cmath>
#define INF 0x3f3f3f3f
using namespace std;
double mapp[200][200];
double mdis[200];
int n,x[1001],y[1001];

double f(int x1,int y1,int x2,int y2){
    return sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2));
}
int main(){
    cin>>n;
    for(int i=1;i<=n;i++)
        scanf("%d%d",x+i,y+i);
    for(int i=1;i<=n;i++){
        for(int j=1;j<=n;j++){
            char c;
            cin>>c;
            mapp[i][j]=mapp[j][i]=c=='1'||i==j?f(x[i],y[i],x[j],y[j]):INF;
        }
    }
    for(int k=1;k<=n;k++)
        for(int i=1;i<=n;i++)
            for(int j=1;j<=n;j++)
                    mapp[i][j]=min(mapp[i][j],mapp[i][k]+mapp[k][j]);

    memset(mdis,0,sizeof(mdis));
    for(int i=1;i<=n;i++)
        for(int j=1;j<=n;j++)
            if(mapp[i][j]<INF&&(mapp[i][j]>mdis[i]))//从i点出发的牧场直径
                mdis[i]=mapp[i][j];
 
    double minn=INF;
    for(int i=1;i<=n;i++)
        for(int j=1;j<=n;j++)
            if(mapp[i][j]==INF&&(mdis[i]+mdis[j]+f(x[i],y[i],x[j],y[j])<minn))
                minn=mdis[i]+mdis[j]+f(x[i],y[i],x[j],y[j]);
 
    for(int i=1;i<=n;i++)//最短直径不小于任何一个分牧场的直径
        minn=max(minn,mdis[i]);

    printf("%.6lf",minn);
    return 0;
}

标签:旅行,200,int,double,1343,mapp,y1,y2
来源: https://www.cnblogs.com/sxrekord/p/cattle_travel.html