题意:一只青蛙想从自己脚下的石头开始调到另一只青蛙的石头上,它可以直接跳,也可以借助别的空石头跳。输入的数据是每个石头的坐标(第一个是这只青蛙踩的石头的坐标,第二个是另一只青蛙踩的石头的坐标)(从一块石头到另一块石头的最大距离)
思路:虽然是最短路的专题,但是感觉也不算是完全最短路的题,应该更多的运用了生成树的东西
读题读了半天...理解能力太差..
完整代码:
#include<iostream> #include<cstdio> #include<cmath> #include<cstring> #include<algorithm> #define inf 0x3f3f3f3f #define maxn 1100 using namespace std; int n,vis[maxn]; double g[maxn][maxn],dist[maxn],ans; struct node { int x,y; }p[maxn]; void dijkstra() { int i,j,index; dist[1]=0; for(i=1 ;i<= n; i++) { double Min=inf; for(j=1;j<= n;j++) { if(vis[j]==0&&Min>=dist[j]) Min=dist[j],index=j; } vis[index]=1; if(ans< dist[index] &&dist[index]!= inf) ans=dist[index]; if(index==2) return ; for(j=1 ;j<= n;j++) { if(vis[j] == 0) dist[j]=min(dist[j],g[index][j]); } } } int main() { int i,j,k,x,y,cnt=1; while(scanf("%d",&n),n) { memset(vis,0, sizeof(vis)); memset(p,0,sizeof(p)); for(i=0;i<=n;i++) dist[i]=inf; k=1; for(i=1;i<=n;i++) { scanf("%d%d",&x,&y); for(j=1;j<=k;j++) { double d= sqrt((x-p[j].x)*(x-p[j].x)+(y-p[j].y)*(y-p[j].y)); g[i][j]=g[j][i]=d; } p[k].x=x,p[k].y=y,k++; } for(i=1;i<=n;i++) g[i][i]=0; ans=0; dijkstra(); printf("Scenario #%d Frog Distance = %.3f ",cnt++,ans); } return 0; }