3 solutions

  • 5
    @ 2024-4-26 13:22:27

    题意

    起点到终点的最短距离

    思路

    模板题,不必多言

    只是需要用到勾股定理

    代码

    #include <bits/stdc++.h>
    using namespace std;
    int a[105][2],s,e;
    double dis[105][105];	// i 到 j 的最短路
    int main(int argc, char **argv){
    	memset(dis,0x7f,sizeof(dis));	// 初始化最短路数组
    	int n,m;
    	cin >> n;
    	for (int i = 1;i <= n;i++){	// 点的位置
    		cin >> a[i][0] >> a[i][1];
    	}
    	cin >> m;
    	for (int i = 1;i <= m;i++){
    		int x,y;
    		cin >> x >> y;
    		// 勾股定理求直线距离
    		dis[x][y] = sqrt((a[x][0] - a[y][0]) * (a[x][0] - a[y][0]) + 
    						(a[x][1] - a[y][1]) * (a[x][1] - a[y][1]));
    		dis[y][x] = dis[x][y];
    	}
    	cin >> s >> e;	// 起点和终点
    	// Floyd 最牛*的五行代码
    	for (int k = 1;k <= n;k++){	// 中间点
    		for (int i = 1;i <= n;i++){	// 起点
    			for (int j = 1;j <= n;j++){	// 终点
    				dis[i][j] = min(dis[i][j],dis[i][k] + dis[k][j]);
    			}
    		}
    	}
    	printf("%.2lf",dis[s][e]);
    	return 0;
    }
    

    参考与鸣谢

    参考了《信息学奥赛一本通》中【例 4.1】的代码

    数据

    免费的测试点

    update2024/5/7:update 2024/5/7: 优化了一下代码,并贡献了一个免费的测试点

    • @ 2024-5-7 20:09:20
      #include<iostream>
      #include<cmath>
      #include<cstring>
      using namespace std;
      int n,m,s,t;
      double dis[114][114];
      int xs[114];
      int ys[114];
      double min(int a,int b)
      {
          if(a<b)
              return a;
          return b;
      }
      void floyd()
      {
          for(int k=1;k<=n;k++)
              for(int i=1;i<=n;i++)
                  for(int j=1;j<=n;j++)
                      dis[i][j]=min(dis[i][j],dis[i][k]+dis[k][j]);
      }
      int main()
      {
          memset(dis,0x7f,sizeof(dis));
          for(int i=1;i<=n;i++)
      		dis[i][i]=0;
          cin>>n;
          for(int i=1;i<=n;i++)
          {
              cin>>xs[i]>>ys[i];
          }
          cin>>m;
          for(int i=1;i<=m;i++)
          {
              int x,y;
              cin>>x>>y;
              int u=xs[x]-xs[y];
              int v=ys[x]-ys[y];
              double w=sqrt(u*u+v*v);
              dis[x][y]=w;
              dis[y][x]=w;
          }
          cin>>s>>t;
          floyd();
          printf("%.2lf\n",dis[s][t]);
          return 0;
      }
      
  • 1
    @ 2024-5-19 12:18:41
    #include <bits/stdc++.h> 
    using namespace std;
    struct str{
        double x,y;	
    }a[101];
    double d[101][101];
    int main(){
    	for(int i=1;i<=101;i++){
    		for(int j=1;j<=101;j++){
    			d[i][j]=2147483647;
    		}
    	}
    	int n;
    	cin>>n;
    	for(int i=1;i<=n;i++){
    		cin>>a[i].x>>a[i].y;
    	}
    	int m;
    	cin>>m;
    	for(int i=1;i<=n;i++){
    		d[i][i]=0;
    	}
    	for(int i=1;i<=m;i++){
    		int u,v;
    		cin>>u>>v;
    		d[u][v]=min(d[u][v],sqrt((a[u].x-a[v].x)*(a[u].x-a[v].x)+(a[u].y-a[v].y)*(a[u].y-a[v].y)));
    		d[v][u]=d[u][v];
    	
    	}
    	for(int k=1;k<=n;k++){
    		for(int i=1;i<=n;i++){
    		    for(int j=1;j<=n;j++){
    		        d[i][j]=min(d[i][j],d[i][k]+d[k][j]);
    			}
    		}
    	}
    	for(int i=1;i<=n;i++){
    	    for(int j=1;j<=n;j++){
    		
    		}
    	}
    	int s,t;
    	cin>>s>>t;
    	printf("%.2f",d[s][t]);
    }
    
    • 1
      @ 2024-5-9 13:21:02
      #include
      using namespace std;
      struct str{
          double x,y;	
      }a[101];
      double d[101][101];
      int main(){
      	for(int i=1;i<=101;i++){
      		for(int j=1;j<=101;j++){
      			d[i][j]=2147483647;
      		}
      	}
      	int n;
      	cin>>n;
      	for(int i=1;i<=n;i++){
      		cin>>a[i].x>>a[i].y;
      	}
      	int m;
      	cin>>m;
      	for(int i=1;i<=n;i++){
      		d[i][i]=0;
      	}
      	for(int i=1;i<=m;i++){
      		int u,v;
      		cin>>u>>v;
      		d[u][v]=min(d[u][v],sqrt((a[u].x-a[v].x)*(a[u].x-a[v].x)+(a[u].y-a[v].y)*(a[u].y-a[v].y)));
      		d[v][u]=d[u][v];
      		//cout<<d[u][v]<<endl;
      	}
      	for(int k=1;k<=n;k++){
      		for(int i=1;i<=n;i++){
      		    for(int j=1;j<=n;j++){
      		        d[i][j]=min(d[i][j],d[i][k]+d[k][j]);
      			}
      		}
      	}
      	for(int i=1;i<=n;i++){
      	    for(int j=1;j<=n;j++){
      			//cout<<d[i][j]<<" ";
      		}
      		//cout<<endl;
      	}
      	int s,t;
      	cin>>s>>t;
      	cout<<fixed<<setprecision(2)<<d[s][t];
      }
      
      • 1

      Information

      ID
      827
      Time
      1000ms
      Memory
      256MiB
      Difficulty
      5
      Tags
      # Submissions
      82
      Accepted
      29
      Uploaded By