很水。。。看了别人的题解之后,也用了暴力。。。 #include<cstdio> #include<cstring> #include<cmath> #include<iostream> using namespace std; const double inf=1e15; const double e=1e-6; int x[210],y[210]; double maze[210][210]; double dis(int i,int j) { return sqrt(double((x[i]-x[j])*(x[i]-x[j])+(y[i]-y[j])*(y[i]-y[j]))); } void floyd(int n) { for(int k=0; k<=n; k++) for(int i=0; i<=n; i++) { if(maze[i][k]+e<inf) for(int j=0; j<=n; j++) if(maze[i][j]>maze[i][k]+maze[k][j]) maze[i][j]=maze[i][k]+maze[k][j]; } } bool check(int i,int j,int k) { if(k!=i && k!=j) if((x[i]-x[k])*(y[k]-y[j])==(x[k]-x[j])*(y[i]-y[k])) if(x[k]>=min(x[i],x[j]) && x[k]<=max(x[i],x[j])) if(y[k]>=min(y[i],y[j]) && y[k]<=max(y[i],y[j])) return true; return false; } int main() { int n,i,j,a,b; int xi,xj; double ans=0; scanf("%d",&n); x[0]=y[0]=0; for(i=1; i<=n; i++) scanf("%d%d",&x[i],&y[i]); for(i=0; i<=n; i++) for(j=0; j<=n; j++) maze[i][j]=inf; for(i=1; i<=n; i++) { scanf("%d%d",&a,&b); maze[a][b]=maze[b][a]=dis(a,b); } floyd(n); for(i=0; i<=n; i++) for(j=i+1; j<=n; j++) { bool flag=true; for(int k=0; k<=n; k++) if(check(i,j,k)) { flag=false; break; } if(flag) { double tmp=maze[i][j]-dis(i,j); if(tmp>ans+e) { ans=tmp; xi=i; xj=j; } } } if(ans<=e) printf("-1/n"); else printf("%d %d/n",xi,xj); return 0; }