Time Limit: 1000MS | Memory Limit: 65536K | |
Total Submissions: 17842 | Accepted: 5818 |
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
/* POJ 2253 */ #include<stdio.h> #include<algorithm> #include<string.h> #include<math.h> #include<iostream> using namespace std; const int MAXN=220; const int INF=0x3f3f3f3f; //*************************************************************** //Dijkstra-数组实现O(n^2) //单源最短路径 //lowcost[]---从点beg到其他点的距离 //不记录路径 //结点编号从1开始的 //**************************************************************** #define INF 0x3f3f3f3f //这个无穷大不能太大,防止后面溢出 #define typec double bool vis[MAXN]; void Dijkstra(typec cost[][MAXN],typec lowcost[MAXN],int n,int beg) { typec minc; int i,j,w; memset(vis,false,sizeof(vis)); vis[beg]=true; for(i=1;i<=n;i++) lowcost[i]=cost[beg][i]; lowcost[beg]=0; for(i=1;i<n;i++) { minc=INF; for(j=1;j<=n;j++) if(!vis[j]&&lowcost[j]<minc) { minc=lowcost[j]; w=j; } if(minc>=INF)break; vis[w]=true; for(j=1;j<=n;j++) if(!vis[j]&&max(lowcost[w],cost[w][j])<lowcost[j]) lowcost[j]=max(lowcost[w],cost[w][j]); } } //************************************************************** double dist[MAXN]; double map[MAXN][MAXN]; struct Node { int x,y; }node[MAXN]; double dis(Node a,Node b) { return sqrt((double)(a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y)); } int main() { //freopen("in.txt","r",stdin); //freopen("out.txt","w",stdout); int n; int iCase=0; while(scanf("%d",&n),n) { iCase++; for(int i=1;i<=n;i++) scanf("%d%d",&node[i].x,&node[i].y); for(int i=1;i<=n;i++) for(int j=i;j<=n;j++) { if(i==j)map[i][j]=0; else map[i][j]=map[j][i]=dis(node[i],node[j]); } Dijkstra(map,dist,n,1); printf("Scenario #%d\nFrog Distance = ",iCase); printf("%.3f\n\n",(dist[2]));//POJ上G++只能用 %f //C++可以%lf } return 0; }