zoukankan      html  css  js  c++  java
  • T2602 最短路径问题 codevs

    时间限制: 1 s
    空间限制: 32000 KB
    题目等级 : 黄金 Gold
     
    题目描述 Description

    平面上有n个点(n<=100),每个点的坐标均在-10000~10000之间。其中的一些点之间有连线。若有连线,则表示可从一个点到达另一个点,即两点间有通路,通路的距离为两点间的直线距离。现在的任务是找出从一点到另一点之间的最短路径。

    输入描述 Input Description

    第一行为整数n。

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

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

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

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

    输出描述 Output Description

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

    样例输入 Sample Input

    5

    0 0

    2 0

    2 2

    0 2

    3 1

    5

    1 2

    1 3

    1 4

    2 5

    3 5

    1 5

    样例输出 Sample Output

    3.41

    数据范围及提示 Data Size & Hint

    Floyd

    #include <algorithm>
    #include <iostream>
    #include <cstring>
    #include <cstdio>
    #include <cmath>
    #define maxn 100000007
    
    using namespace std;
    
    int n,m,s,t,d1,d2;
    struct node
    {
        double x,y;
    }a[105];
    double dis[105][105];
    
    int main()
    {
        scanf("%d",&n);
        for(int i=1;i<=n;i++)
            for(int j=1;j<=n;j++)
                    dis[i][j]=maxn;
        for(int i=1;i<=n;i++)
            cin>>a[i].x>>a[i].y;
        scanf("%d",&m);
        for(int i=1;i<=m;i++)
        {
            scanf("%d%d",&d1,&d2);
            dis[d1][d2]=dis[d2][d1]=sqrt((a[d1].x-a[d2].x)*(a[d1].x-a[d2].x)+(a[d1].y-a[d2].y)*(a[d1].y-a[d2].y));
        }
        scanf("%d%d",&s,&t);
        
        for(int k=1;k<=n;k++)
            for(int i=1;i<=n;i++)
                for(int j=1;j<=n;j++)
                {
                    if(i!=j&&j!=k&&i!=k&&dis[i][j]>dis[i][k]+dis[k][j])
                        dis[i][j]=dis[i][k]+dis[k][j];
                }
        printf("%.2lf",dis[s][t]);
        return 0;
    }
    Dijkstra
    #include <algorithm>
    #include <iostream>
    #include <cstdio>
    #include <cmath>
    #define maxn 10000007
    
    using namespace std;
    
    int n,m,d1,d2,s,t;
    struct node
    {
        double x,y;
    }a[105];
    double c[115],dis[115][115],minl;
    bool boo[115];
    
    int main()
    {
        scanf("%d",&n);
        for(int i=1;i<=n;i++)
            for(int j=1;j<=n;j++)
                dis[i][j]=c[i]=maxn;
        for(int i=1;i<=n;i++)
            cin>>a[i].x>>a[i].y;
        scanf("%d",&m);
        for(int i=1;i<=m;i++)
        {
            scanf("%d%d",&d1,&d2);
            dis[d1][d2]=dis[d2][d1]=sqrt((a[d1].x-a[d2].x)*(a[d1].x-a[d2].x)+(a[d1].y-a[d2].y)*(a[d1].y-a[d2].y));
        }
        scanf("%d%d",&s,&t);
        for(int i=1;i<=n;i++)
            c[i]=dis[s][i];
        c[s]=0;
        boo[s]=true;
        for(int i=1;i<n;i++)
        {
            minl=maxn;
            int k=0;
            for(int j=1;j<=n;j++)
                if(!boo[j]&&c[j]<minl)
                {
                    minl=c[j];
                    k=j;
                }
            if(k==0)    break;
            boo[k]=true;
            for(int j=1;j<=n;j++)
                if(c[k]+dis[k][j]<c[j])
                    c[j]=c[k]+dis[k][j];
        }
        printf("%.2lf",c[t]);
        return 0;
    }
    ——每当你想要放弃的时候,就想想是为了什么才一路坚持到现在。
  • 相关阅读:
    leetcode5 Longest Palindromic Substring
    leetcode17 Letter Combinations of a Phone Number
    leetcode13 Roman to Integer
    leetcode14 Longest Common Prefix
    leetcode20 Valid Parentheses
    leetcode392 Is Subsequence
    leetcode121 Best Time to Buy and Sell Stock
    leetcode198 House Robber
    leetcode746 Min Cost Climbing Stairs
    tomcat下使用druid配置jnid数据源
  • 原文地址:https://www.cnblogs.com/Shy-key/p/6492854.html
Copyright © 2011-2022 走看看