1 solutions

  • 0
    @ 2025-3-3 16:24:07

    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;
    }
    
    • 1

    Information

    ID
    9991
    Time
    1000ms
    Memory
    128MiB
    Difficulty
    (None)
    Tags
    # Submissions
    0
    Accepted
    0
    Uploaded By