1 条题解

  • 1
    @ 2024-5-4 10:11:12

    本蒟蒻这个号的第一篇题解——最短路

    本题的思路与题目名字一个样,就是求两点之间的最短路

    可以用floyed, 我用的就是,其他算法我就不写了,绝对不是懒

    可以理解像这样的一幅图(举个栗子)
    |   y
    | /  0
    |1—x/
    

    1为初始点,0为终点 那么此时, 很明显最短路是1>x>0 此时距离也就是x+sqrt(11+11),也就是约3.41。

    简单点说就是,判断一个地方到另一个地方,是直接去快,还是多去一个换乘点更快

    所以说是这段代码

    void floyed(){
    	for(int k=1;k<=n;k++){
    		for(int i=1;i<=n;i++){
    			for(int j=1;j<=n;j++){
    				g[i][j]=min(g[i][j],g[i][k]+g[k][j]);//g[i][j]表示从i到j的距离
    //本句子表示说是从i到j短还是从i到k再到j短
    			}
    		}
    	}
    }
    

    floyed写完了,输入与计算就不需要讲了,知道勾股定理吧,就用这个算。 完整代码如下:

    #include <bits/stdc++.h>
    using namespace std;
    const int N=104;
    int n,m,x,y,a[N],b[N];
    double g[N][N];
    void floyed(){
    	for(int k=1;k<=n;k++){
    		for(int i=1;i<=n;i++){
    			for(int j=1;j<=n;j++){
    				g[i][j]=min(g[i][j],g[i][k]+g[k][j]);//g[i][j]表示从i到j的距离
    //本句子表示说是从i到j短还是从i到k再到j短
    			}
    		}
    	}
    }
    int main() {
    	cin>>n;
    	for(int i=1;i<=n;i++){
    		cin>>a[i]>>b[i];
    	}//输入
    	cin>>m;
    	memset(g,0x7f,sizeof g);
    	for(int i=1;i<=n;i++){
    		cin>>x>>y;
    		g[x][y]=g[y][x]=sqrt(pow(a[x]-a[y],2)+pow(b[x]-b[y],2));//勾股定理
    	}
    	floyed();
    	cin>>x>>y;//问从x到y
    	cout<<fixed<<setprecision(2)<<g[x][y];
    	return 0;
    }
    

    信息

    ID
    451
    时间
    1000ms
    内存
    256MiB
    难度
    9
    标签
    递交数
    10
    已通过
    5
    上传者