1 条题解
-
0
C :
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <math.h> #define INF 1000000000 double G[110][110]; int axis[110][2]; int vis[110]; double d[110]; int n, m; int A, B; void dijkstra(){ memset(vis,0,sizeof(vis)); for(int i = 0;i <= n; i++)d[i] = INF; d[A] = 0; for(int i = 1;i <= n; i++){ int u = -1, MIN = INF; for(int j = 1;j <= n; j++){ if(vis[j]==0 && MIN > d[j]){ u = j; MIN = d[j]; } } if(u == B)return; vis[u] = 1; for(int v = 1;v <= n; v++){ if(vis[v]==0 && G[u][v] != 0 && d[v] > d[u] + G[u][v]){ d[v] = d[u] + G[u][v]; } } } } int main() { while(scanf("%d",&n) != EOF){ memset(G,0,sizeof(G)); for(int i = 1;i <= n; i++){ scanf("%d%d",&axis[i][0],&axis[i][1]); } scanf("%d",&m); while(m--){ int a, b; scanf("%d%d",&a,&b); double dis = sqrt((axis[a][0]-axis[b][0])*(axis[a][0]-axis[b][0]) + \ (axis[a][1]-axis[b][1])*(axis[a][1]-axis[b][1])); G[a][b] = G[b][a] = dis; } scanf("%d%d",&A,&B); dijkstra(); printf("%.2f\n",d[B]); } return 0; }
C++ :
#include<cstdio> #include<iostream> #include<cstring> #include<cmath> using namespace std; double x[110],y[110],dis[101],a[101][101]; bool v[101]; int n,m,xx,yy,st,ed; int q[10000]; inline double calc(int i,int j){ return sqrt((x[i]-x[j])*(x[i]-x[j])+(y[i]-y[j])*(y[i]-y[j])); } void spfa(){ memset(v,0,sizeof(v)); for(int i=1;i<=n;++i) dis[i]=99999999.0; int l=1,r=1; q[1]=st; dis[st]=0; v[st]=true; while (l<=r){ int x=q[l++]; v[x]=false; for(int i=1;i<=n;++i) if (i!=x && a[x][i]<0x7fffffff) if (dis[i]>dis[x]+a[x][i]){ dis[i]=dis[x]+a[x][i]; if (!v[i]){ v[i]=true; q[++r]=i; } } } } int main(){ cin>>n; for(int i=1;i<=n;++i) for(int j=1;j<=n;++j) a[i][j]=0x7fffffff; for(int i=1;i<=n;++i) a[i][i]=0; for(int i=1;i<=n;++i) scanf("%lf%lf",&x[i],&y[i]); cin>>m; for(int i=1;i<=m;++i){ scanf("%d%d",&xx,&yy); if (xx!=yy) a[xx][yy]=a[yy][xx]=calc(xx,yy); } cin>>st>>ed; spfa(); printf("%0.2lf",dis[ed]); return 0; }
Pascal :
program spfa; type point=^node; node=record y:longint; z:real; next:point; end; jj=record x,y:longint; end; var i,j,n,m,s,t,x,y:longint; dist:array[0..100] of real; v:array[0..100] of boolean; a:array[0..100] of point; b:array[0..100] of jj; q:array[0..1000000] of longint; procedure insert; var p:point; begin new(p); p^.y:=y; p^.z:=sqrt(sqr(b[x].x-b[y].x)+sqr(b[x].y-b[y].y)); p^.next:=a[x]; a[x]:=p; new(p); p^.y:=x; p^.z:=sqrt(sqr(b[x].x-b[y].x)+sqr(b[x].y-b[y].y)); p^.next:=a[y]; a[y]:=p; end; procedure spfa; var head,tail,x,y:longint; z:real; p:point; begin head:=0; tail:=1; q[1]:=s; v[s]:=true; dist[s]:=0; while head<tail do begin inc(head); x:=q[head]; p:=a[x]; while p<>nil do begin y:=p^.y; z:=p^.z; if dist[y]>dist[x]+z then begin dist[y]:=dist[x]+z; if not v[y] then begin v[y]:=true; inc(tail); q[tail]:=y; end; end; p:=p^.next; end; v[x]:=false; end; end; begin readln(n); for i:=1 to n do readln(b[i].x,b[i].y); readln(m); for i:=1 to n do dist[i]:=9999999; for i:=1 to m do begin readln(x,y); insert; end; readln(s,t); spfa; writeln(dist[t]:0:2); end.
- 1
信息
- ID
- 1545
- 时间
- 1000ms
- 内存
- 128MiB
- 难度
- (无)
- 标签
- 递交数
- 0
- 已通过
- 0
- 上传者