zoukankan      html  css  js  c++  java
  • cogs 1075. [省常中2011S4] 最短路径问题

    ★   输入文件:short.in   输出文件:short.out   简单对比
    时间限制:1 s   内存限制:128 MB

     [问题描述] 

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

    [输入格式] 

    输入文件为short.in,共n+m+3行,其中:

    第一行为整数n。

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

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

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

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

    [输出格式] 

    输出文件为short.out,仅一行,一个实数(保留两位小数),表示从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

      1 #include<iostream>
      2 #include<cstdio>
      3 #include<algorithm>
      4 #include<cmath>
      5 #include<queue>
      6 
      7 using namespace std;
      8 const int N=1001;
      9 const int maxn=999999;
     10 
     11 int head[N];
     12 double dis[N];
     13 int vis[N];
     14 int now=1;
     15 queue<int>q;
     16 int m;
     17 int n;
     18 int s;
     19 int e;
     20 
     21 struct node{
     22     double x,y;
     23 }D[N];
     24 
     25 struct NODE{
     26     int u,v,nxt;
     27     double w;
     28 }E[N*10];
     29 
     30 inline void read(int &x)
     31 {
     32     char c=getchar();
     33     x=0;
     34     while(c<'0'||c>'9')c=getchar();
     35     while(c>='0'&&c<='9')x=x*10+c-'0',c=getchar();
     36 }
     37 
     38 inline double j(int u,int v)
     39 {
     40     return sqrt(pow(abs(D[u].x-D[v].x),2)+pow(abs(D[u].y-D[v].y),2));
     41 }
     42 
     43 inline void add(int u,int v,double w)
     44 {
     45     E[now].u=u;
     46     E[now].v=v;
     47     E[now].w=w;
     48     E[now].nxt=head[u];
     49     head[u]=now;
     50     now++;
     51 }
     52 
     53 inline void spfa(int s)
     54 {
     55     for(int i=1;i<=n;i++)
     56         dis[i]=maxn;
     57     dis[s]=0;
     58     vis[s]=1;
     59     q.push(s);
     60     while(!q.empty())
     61     {
     62         int top=q.front();
     63         q.pop();
     64         vis[top]=0;
     65         for(int i=head[top];i!=-1;i=E[i].nxt)
     66         {
     67             int v=E[i].v;
     68             double w=E[i].w;
     69             if(dis[v]>dis[top]+w)
     70             {
     71                 dis[v]=dis[top]+w;
     72                 if(!vis[v])
     73                 {
     74                     vis[v]=1;
     75                     q.push(v);
     76                 }
     77             }
     78         }
     79     }
     80     printf("%.2lf",dis[e]);
     81     return ;
     82 }
     83 
     84 int main()
     85 {
     86     freopen("short.in","r",stdin);
     87     freopen("short.out","w",stdout);
     88     read(n);        
     89     
     90     for(int i=1;i<=n;i++)
     91     {
     92         scanf("%lf%lf",&D[i].x,&D[i].y);
     93         head[i]=-1;
     94     }
     95     read(m);
     96     for(int i=1;i<=m;i++)
     97     {
     98         int u,v;
     99         read(u);
    100         read(v);
    101         double jl=j(u,v);
    102         add(u,v,jl);
    103         add(v,u,jl);
    104     }
    105     
    106     read(s);read(e);
    107     spfa(s);
    108     
    109     return 0;
    110     
    111 }
  • 相关阅读:
    Kinect 开发 —— 硬件设备解剖
    Kinect 开发 —— 引言
    (转)OpenCV 基本知识框架
    OpenCV —— 摄像机模型与标定
    OpenCV —— 跟踪与运动
    OpenCV —— 图像局部与分割(二)
    OpenCV —— 图像局部与部分分割(一)
    OpenCV —— 轮廓
    OpenCV —— 直方图与匹配
    OpenCV —— 图像变换
  • 原文地址:https://www.cnblogs.com/lyqlyq/p/6868176.html
Copyright © 2011-2022 走看看