蒟蒻求救
查看原帖
蒟蒻求救
49557
39849s楼主2022/9/11 12:03

如果我用一个char的二维数组记录那几个牧区是通的,在计算牧区间的最短路径时,对小数据还能算对,但在n较大时候就会计算错误,不知道为什么,求救 下面第一个是我的,第二个是正确的(虽然过不了#11)

#include<iostream>
#include<cstdio>
#include<cmath>
const int maxn=152;
const double inf=0x3f3f3f3f;
using namespace std;
int n;
double x[maxn],y[maxn];
char k[maxn][maxn];
double mapp[maxn][maxn];
double m[maxn];
int main()
{
	scanf("%d",&n);
	for(int i=1;i<=n;i++)	scanf("%lf%lf",&x[i],&y[i]);
	for(int i=1;i<=n;i++)
		for(int j=1;j<=n;j++)
		{
			cin>>k[i][j];
			mapp[i][j]=inf;
			if(k[i][j]=='1')
				mapp[i][j]=sqrt((x[i]-x[j])*(x[i]-x[j]) +(y[i]-y[j])*(y[i]-y[j])); 
		}	
	for(int kk=1;kk<=n;kk++)
		for(int i=1;i<=n;i++)
			for(int j=1;j<=n;j++)
				if(k[i][kk]=='1'&&k[kk][j]=='1'&&i!=j)
					mapp[i][j]=min(mapp[i][j],mapp[i][kk]+mapp[kk][j]);
	for(int i=1;i<=n;i++)
		for(int j=1;j<=n;j++)
			if(mapp[i][j]!=inf&&i!=j)	m[i]= m[i]>mapp[i][j]? m[i]:mapp[i][j];
			
	double minn=inf;
	for(int i=1;i<=n;i++)
		for(int j=1;j<i;j++)
			if(k[i][j]=='0')
				minn=min(minn,m[i]+m[j]+sqrt((x[i]-x[j])*(x[i]-x[j]) +(y[i]-y[j])*(y[i]-y[j])) ); 	
	//printf("%.6lf\n",minn);
	for(int i=1;i<=n;i++) minn=max(minn,m[i]);
	//for(int i=1;i<=n;i++) printf("%.6lf\n",m[i]);
	printf("%.6lf\n",minn);		
	return 0;
}
#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]);
	//for(int i=1;i<=n;i++) printf("%.6lf\n",mdis[i]);
    printf("%.6lf",minn);
    return 0;

}
2022/9/11 12:03
加载中...