这题的坑点在POJ输出double不能用%.lf而要用%.f。。。真是神坑。
题意:给出一个无向图,求节点1到2之间的最大边的边权的最小值。
算法:Dijkstra
题目每次选择权值最小的边进行延伸访问,最坏情况下每条路径都要访问,复杂度O(n^2)
代码:
#include <iostream> #include <cstdio> #include <cstring> #include <cmath> #include <algorithm> #define Mod 1000000007 using namespace std; #define N 207 struct point { int x,y; }p[N]; int n; double res,mini; double way[N][N],d[N]; int vis[N]; void Dijastra() { int i,j,k; for(i=1;i<=n;i++) d[i] = Mod; d[1] = 0; memset(vis,0,sizeof(vis)); for(i=1;i<=n;i++) { mini = Mod; for(j=1;j<=n;j++) { if(!vis[j] && d[j] <= mini) { k = j; mini = d[j]; } } vis[k] = 1; if(res < d[k] && d[k] != Mod) res = d[k]; if(k == 2) return; for(j=1;j<=n;j++) { if(!vis[j]) d[j] = min(d[j],way[k][j]); } } } double dis(point ka,point kb) { return sqrt((ka.x-kb.x)*(ka.x-kb.x)+(ka.y-kb.y)*(ka.y-kb.y)); } int main() { int cs = 1,i,j; while(scanf("%d",&n)!=EOF && n) { for(i=1;i<=n;i++) scanf("%d%d",&p[i].x,&p[i].y); for(i=1;i<=n;i++) { for(j=i;j<=n;j++) { way[i][j] = way[j][i] = dis(p[i],p[j]); } way[i][i] = 0; } res = 0; Dijastra(); printf("Scenario #%d\n",cs++); printf("Frog Distance = %.3f\n\n",res); // %.3f } return 0; }