zoukankan      html  css  js  c++  java
  • 1342:【例4-1】最短路径问题

    【题目描述】

    平面上有n个点(n≤100),每个点的坐标均在-10000~10000之间。其中的一些点之间有连线。

    若有连线,则表示可从一个点到达另一个点,即两点间有通路,通路的距离为两点间的直线距离。现在的任务是找出从一点到另一点之间的最短路径。

    【输入】

    共n+m+3行,其中:

    第一行为整数n。

    第2行到第n+1行(共n行) ,每行两个整数x和y,描述了一个点的坐标。

    第n+2行为一个整数m,表示图中连线的个数。

    此后的m 行,每行描述一条连线,由两个整数i和j组成,表示第i个点和第j个点之间有连线。

    最后一行:两个整数s和t,分别表示源点和目标点。

    【输出】

    一行,一个实数(保留两位小数),表示从s到t的最短路径长度。

    【输入样例】

    5 
    0 0
    
    2 0
    2 2
    0 2
    3 1
    5 
    1 2
    1 3
    1 4
    2 5
    3 5
    1 5

    【输出样例】

    3.41
    #include<bits/stdc++.h>
    using namespace std;
    #define N 100+1
    double f[N][N];
    int n,m,a[N][3],s,t;
    double zb(int x,int y)
    {
        return sqrt(pow(double(a[x][1]-a[y][1]),2)+pow(double(a[x][2]-a[y][2]),2));
    }
    int main()
    {
        memset(f,127,sizeof(f));
        cin>>n;
        for(int i=1;i<=n;i++)cin>>a[i][1]>>a[i][2];
        cin>>m;
        for(int i=1;i<=m;i++)
        {
            int x,y;
            cin>>x>>y;
            f[x][y]=zb(x,y);
            f[y][x]=f[x][y];
        }
        for(int k=1;k<=n;k++)
            for(int i=1;i<=n;i++)   
                for(int j=1;j<=n;j++)
                    if(i!=j&&i!=k&&j!=k)
                        f[i][j]=min(f[i][j],f[i][k]+f[k][j]);
        cin>>s>>t;
        printf("%.2f
    ",f[s][t]);
    }
  • 相关阅读:
    从Oracle提供两种cube产品说开
    Sql Server DWBI的几个学习资料
    Unload Oracle data into text file
    初学Java的几个tips
    我常用的Oracle知识点汇总
    benefits by using svn
    如何在windows上使用putty来显示远端linux的桌面
    building commercial website using Microsoft tech stack
    Understand Thread and Lock
    Update google calendar by sunbird
  • 原文地址:https://www.cnblogs.com/jzxnl/p/11396633.html
Copyright © 2011-2022 走看看