1 条题解

  • 0
    @ 2025-4-27 19:23:28

    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
    上传者