练练手吧~~~-->__<--
关键点:dist[v]=min(dist[v],max(dist[u],cost[i]));
spfa
#include<stdio.h> #include<string.h> #include<algorithm> using namespace std; #include<math.h> #define N 210 #define inf 999999999 struct node { int x,y; }point[N*N]; int n,m,head[N],e; int pnt[N*N],nxt[N*N]; double cost[N*N]; void add(int u,int v,double c) { pnt[e]=v;cost[e]=c;nxt[e]=head[u];head[u]=e++; } double spfa(int s) { double dist[N];int vis[N]; for(int i=0;i<n;i++) dist[i]=inf,vis[i]=0; dist[s]=0; vis[s]=1; int q[N*N],top=1; q[0]=s; while(top) { int u=q[--top];vis[u]=0; for(int i=head[u];i!=-1;i=nxt[i]) { int v=pnt[i]; if(dist[v]>max(dist[u],cost[i])) { dist[v]=max(dist[u],cost[i]); if(!vis[v]) { vis[v]=1; q[top++]=v; } } } } return dist[1]; } double dis(node p,node q) { return sqrt((p.x-q.x)*(p.x-q.x)+(p.y-q.y)*(p.y-q.y)); } int main() { int cs=1; while(scanf("%d",&n),n) { e=0; memset(head,-1,sizeof(head)); for(int i = 0;i < n;i ++) { scanf("%d%d",&point[i].x,&point[i].y); for(int j=0;j<i;j++) { add(i,j,dis(point[i],point[j])); add(j,i,dis(point[i],point[j])); } } printf("Scenario #%d\n",cs++); printf("Frog Distance = %.3f\n\n", spfa(0)); } return 0; }
prim +dij +floyd
#include<stdio.h> #include<string.h> #include<math.h> #define N 210 #define inf 999999999 struct node { int x,y; }point[N*N]; double max(double a,double b) { return a>b? a:b; } double map[N][N]; int n,m; double prim() { int vis[N];double dist[N]; for(int i=0;i<n;i++) dist[i]=map[0][i]; memset(vis,0,sizeof(vis)); vis[0]=1;dist[0]=0; double cnt=0; for(int i=1;i<n;i++) { double min=inf;int pos=0; for(int j=0;j<n;j++) { if(!vis[j]&&dist[j]<min) { min=dist[j];pos=j; } } if(cnt < min) cnt=min; if(pos==1) break; vis[pos]=1; for(int j=0;j<n;j++) { if(!vis[j]&&dist[j]>map[pos][j]) dist[j]=map[pos][j]; } } return cnt; } double dij() { int vis[N];double dist[N]; for(int i=0;i<n;i++) dist[i]=map[0][i]; memset(vis,0,sizeof(vis)); vis[0]=1;dist[0]=0; for(int i=1;i<n;i++) { double min=inf;int pos=0; for(int j=0;j<n;j++) { if(!vis[j]&&dist[j]<min) { min=dist[j];pos=j; } } if(pos==1) break; vis[pos]=1; for(int j=0;j<n;j++) { if(!vis[j]&&dist[j]>max(map[pos][j],dist[pos])) dist[j]=max(map[pos][j],dist[pos]); } } return dist[1]; } double dis(node p,node q) { return sqrt((p.x-q.x)*(p.x-q.x)+(p.y-q.y)*(p.y-q.y)); } void floyd() { for(int k=0;k<n;k++) for(int i=0;i<n;i++) for(int j=0;j<n;j++) { if(map[i][j] > max(map[i][k],map[k][j]) ) map[i][j]=max(map[i][k],map[k][j]); } } int main() { int cs=1; while(scanf("%d",&n),n) { for(int i = 0;i < n;i ++) { scanf("%d%d",&point[i].x,&point[i].y); for(int j=0;j<i;j++) map[i][j] =map[j][i]=dis(point[i],point[j]); } printf("Scenario #%d\n",cs++); printf("Frog Distance = %.3f\n\n", dij()); } return 0; }