标签:least turn nod number ima class 解题思路 输入 represent
题目链接:
http://poj.org/problem?id=2253
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
题意描述:
输入几个顶点的坐标
计算并输出从一号顶点到二号顶点所有最短路径中的最长距离
解题思路:
首先求出最短路径,Dijkstra算法不变,变化的是dis数组中存储的是所走的最短路径中最短的一段距离,在更新dis数组是加上判断条件即可。
属于最短路径最大权值,题目很经典,另还需了解
最短路径双重最小权值请参考:http://www.cnblogs.com/wenzhixin/p/7405802.html
最长路径最小权值请参考:http://www.cnblogs.com/wenzhixin/p/7336948.html
AC代码:
1 #include<stdio.h> 2 #include<string.h> 3 #include<math.h> 4 #include<algorithm> 5 using namespace std; 6 struct Node 7 { 8 double x,y; 9 }; 10 struct Node node[210]; 11 double e[210][210],dis[210]; 12 int main() 13 { 14 int n,book[210],i,j,u,v,t=1; 15 double x,y,inf=99999999,mins; 16 while(scanf("%d",&n),n != 0) 17 { 18 for(i=1;i<=n;i++) 19 for(j=1;j<=n;j++) 20 e[i][j]=inf; 21 for(i=1;i<=n;i++) 22 scanf("%lf%lf",&node[i].x,&node[i].y); 23 for(i=1;i<=n;i++) 24 { 25 for(j=1;j<=n;j++) 26 { 27 if(i != j) 28 e[i][j]=sqrt(fabs(node[i].x-node[j].x)*fabs(node[i].x-node[j].x) 29 +fabs(node[i].y-node[j].y)*fabs(node[i].y-node[j].y)); 30 } 31 } 32 33 for(i=1;i<=n;i++) 34 dis[i]=e[1][i]; 35 memset(book,0,sizeof(book)); 36 book[1]=1; 37 for(i=1;i<=n-1;i++) 38 { 39 mins=inf; 40 for(j=1;j<=n;j++) 41 { 42 if(!book[j] && dis[j] < mins) 43 { 44 mins=dis[j]; 45 u=j; 46 } 47 } 48 book[u]=1; 49 for(v=1;v<=n;v++) 50 { 51 if(!book[v] && e[u][v] < inf) 52 { 53 if(dis[v] > max(dis[u],e[u][v])) 54 dis[v]=max(dis[u],e[u][v]); 55 } 56 } 57 } 58 printf("Scenario #%d\nFrog Distance = %.3lf\n\n",t++,dis[2]); 59 } 60 return 0; 61 }
POJ 2253 Frogger(Dijkstra变形——最短路径最小权值)
标签:least turn nod number ima class 解题思路 输入 represent
原文地址:http://www.cnblogs.com/wenzhixin/p/7406333.html