Time Limit: 1000MS | Memory Limit: 65536K | |
Total Submissions: 30620 | Accepted: 9875 |
Description
Input
Output
Sample Input
2 0 0 3 4 3 17 4 19 4 18 5 0
Sample Output
Scenario #1 Frog Distance = 5.000 Scenario #2 Frog Distance = 1.414
Source
题目大意,有两只青蛙,分别在两个石头上,青蛙A想要到青蛙B那儿去,他可以直接跳到B的石头上,也可以跳到其他石头上,再从其他石头跳到B那儿, 求青蛙从A到B的所有路径中最小的Frog Distance,我们定义Frog Distance为从A到B的一条路径中所跳的最大距离, 例如,如果从A到B某条路径跳的距离是2,5,6,4,则Frog Distance就是6, 题目输入的第一行代表石头的个数,当个数为0时结束程序,接着有n行,其中第2,3行分别代表A,B青蛙的坐标,其他n-2行分别代表空的石头的坐标, 输出一个小数(保留三位),具体格式参见样例,注意没输出一个答案还要再空一行。Ulm Local 1997
#include<iostream> #include<cstdio> #include<cstring> #include<cmath> #define INF 100000000.0 using namespace std; struct node { int x,y; } point[300]; double chuli(node p1,node p2) { return pow((p1.x-p2.x)*(p1.x-p2.x)+(p1.y-p2.y)*(p1.y-p2.y),1.0/2); } double Map[1200][1200]; double a[2000]; double low[2000]; int next[2000]; int n; int Prim(int u0) { int i,j; for(i=0; i<n; i++) { low[i]=Map[u0][i]; next[i]=u0; } next[u0]=-1; double max=0.0; for(i=0; i<n-1; i++) { double min=INF; int v=-1; for(j=0; j<n; j++) { if(next[j]!=-1&&low[j]<min) { min=low[j]; v=j; } } if(min>max) max=min; //本体的核心 if(a[v]<0.0000001) // { a[v]=max; if(v==1) break; } if(v!=-1) { next[v]=-1; for(j=0; j<n; j++) { if(next[j]!=-1 &&Map[v][j]<low[j]) { low[j]=Map[v][j]; next[j]=v; } } } } printf("Frog Distance = %.3f\n",a[1]); //poj不支持 %lf } int main() { int Case=1; while(~scanf("%d",&n)) { if(n==0) break; for(int i=0; i<n; i++) { scanf("%d%d",&point[i].x,&point[i].y); } for(int i=0; i<n; i++) a[i]=0.0; for(int i=0; i<n; i++) for(int j=0; j<n; j++) { Map[i][j]=chuli(point[i],point[j]); } printf("Scenario #%d\n",Case++); Prim(0); printf("\n"); //cout<<"*"; } }
#include<iostream> //#include<cstring> #include<cstdio> #include<cmath> #include<queue> #define INF 0x3f3f3f3f using namespace std; struct node { int x,y; } p[1100]; int a[1100][1100]; int vis[1100],n; int low[1100]; int prim() { for(int i=0; i<n; i++) { vis[i]=0; low[i]=a[0][i]; } low[0]=0; int Max=-1; vis[0]=1; for(int i=0; i<n-1; i++) { int Min=INF,k=-1; for(int j=0; j<n; j++) { if(!vis[j]&&low[j]<Min) { Min=low[j]; k=j; } } if(Max<Min) Max=Min; if(k==1) break; if(k!=-1) { vis[k]=1; for(int j=0; j<n; j++) { if(!vis[j]&&low[j]>a[k][j]) low[j]=a[k][j]; } } } double t=sqrt(Max*1.0); printf("Frog Distance = %.3f\n\n",t); return 0; } int main() { string str; str="jsdfsd"; int Cas=0; while(~scanf("%d",&n),n) { for(int i=0; i<n; i++) { scanf("%d%d",&p[i].x,&p[i].y); } for(int i=0; i<n; i++) { for(int j=0; j<n; j++) { a[i][j]=(p[i].x-p[j].x)*(p[i].x-p[j].x)+(p[i].y-p[j].y)*(p[i].y-p[j].y); } } printf("Scenario #%d\n",++Cas); prim(); } return 0; }