zoukankan      html  css  js  c++  java
  • 2602 最短路径问题Dihstra算法

    题目描述 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
     1 #include<iostream>
     2 #include<cstdio>
     3 #include<cstring>
     4 #include<cmath>
     5 using namespace std;
     6 double db_maxn=127;
     7 double maxn=127;
     8 struct node
     9 {
    10     double x;
    11     double y;
    12 }a[1001];
    13 double dis[1001];
    14 int vis[1001];
    15 int n;
    16 double map[101][101];
    17 void Dijkstra(int u)
    18 {
    19     memset(vis,0,sizeof(vis));
    20     for(int i=1;i<=n;i++)
    21     {
    22         dis[i]=map[u][i];
    23     }
    24     dis[u]=0;
    25     vis[u]=1;
    26     for(int i=1;i<n;i++)
    27     {
    28         double minn=99999999;
    29         int k=-1;
    30         for(int j=1;j<=n;j++)
    31         {
    32             if((dis[j]<=minn)&&vis[j]==0)
    33             {
    34                 minn=dis[j];
    35                 k=j;
    36             }
    37         }
    38         vis[k]=1;
    39         for(int j=1;j<=n;j++)
    40         {
    41             if((dis[j]>=dis[k]+map[k][j])&&vis[j]==0)
    42             dis[j]=dis[k]+map[k][j];
    43         }
    44     }
    45 }
    46 int main()
    47 {
    48     memset(map,db_maxn,sizeof(map));
    49     memset(dis,db_maxn,sizeof(dis));
    50     scanf("%d",&n);
    51     for(int i=1;i<=n;i++)
    52     {
    53         scanf("%lf%lf",&a[i].x,&a[i].y);
    54         //a[i].cd=sqrt((pow(abs(x),2))+(pow(abs(y),2)));
    55     }
    56     int m;
    57     scanf("%d",&m);
    58     for(int i=1;i<=m;i++)
    59     {
    60         int p,q;
    61         scanf("%d%d",&p,&q);
    62         double y=sqrt(pow(a[p].x-a[q].x,2)+pow(a[p].y-a[q].y,2));
    63         map[p][q]=y; 
    64         map[q][p]=y;
    65     }
    66     int u,v;
    67     scanf("%d%d",&u,&v);
    68     Dijkstra(u);
    69     printf("%0.2lf",dis[v]);
    70     return 0;
    71 }
  • 相关阅读:
    求给定数里的数的质数最大——pku3048
    poj1106
    poj1450
    poj1094
    poj1111
    poj1120
    C#.NET学习笔记 类,接口,对象
    在Repeater中嵌套使用Repeater
    数据表分区解决方案(转)
    C#小数点格式化
  • 原文地址:https://www.cnblogs.com/zwfymqz/p/6686058.html
Copyright © 2011-2022 走看看