zoukankan      html  css  js  c++  java
  • hdu 1245 Saving James Bond 策画几何+最短路 最短路求步数最少的路径

    #include<stdio.h>
    #include<string.h>
    #include<math.h>
    #define inf 0x3fffffff
    #define N 200
    #define eps  1e-10
    #include<queue>
    using namespace std;
    struct node {
     int x,y;
    }ma[N];
    struct nodee {
    int u,v,next;
    double w;
    }bian[N*N];
    int yong,head[N],n;
    void addedge(int u,int v,double w) {
    bian[yong].u=u;
    bian[yong].v=v;
    bian[yong].w=w;
    bian[yong].next=head[u];
    head[u]=yong++;
    }
    double MIN(double  a,double b) {
    return a>b?b:a;
    }
    void  bfs() {//宽搜
        queue<int>q;
        double dist[N];
        int step[N],i,visit[N];
        memset(visit,0,sizeof(visit));
        while(!q.empty())
            q.pop();
        q.push(0);
        for(i=1;i<=n+1;i++) 
            dist[i]=inf;
        step[0]=0;
       dist[0]=0;visit[0]=1;
        while(!q.empty()){
            int cur=q.front();
            q.pop();
            for(i=head[cur];i!=-1;i=bian[i].next) {
                int v=bian[i].v;
                if((dist[v]>dist[cur]+bian[i].w+eps||fabs(dist[v]-dist[cur]-bian[i].w)<=eps)&&step[v]>step[cur]+1&&visit[v]==0) {//判断条件如果相等就要比较它的最少的步数
                    step[v]=step[cur]+1;
                    dist[v]=dist[cur]+bian[i].w;
                    visit[v]=1;
                    q.push(v);
                }
            }
        }
        if(dist[n+1]<inf)
            printf("%.2f %d
    ",dist[n+1],step[n+1]);
        else
            printf("can't be saved
    ");
            return ;
    }
    int main() {
         int i,j,s,t;
         double limit,minn;
         while(scanf("%d%lf",&n,&limit)!=EOF) {
                t=n+1;s=0;
                yong=0;
                memset(head,-1,sizeof(head));
            for(i=1;i<=n;i++) {
                scanf("%d%d",&ma[i].x,&ma[i].y);
              minn=MIN(fabs(50.0-fabs(1.0*ma[i].x)),fabs(50.0-fabs(1.0*ma[i].y)));
                if(minn<limit+eps) {//将符合条件的边
                    addedge(i,t,minn);
                    addedge(t,i,0);//
                }
                minn=fabs(sqrt(1.0*ma[i].x*ma[i].x+1.0*ma[i].y*ma[i].y)-7.5);
                 if(minn<limit+eps) {
                  addedge(s,i,minn);//
                  addedge(i,s,0);//
                 }
         }
        if(limit+eps>42.50) {//如果可以直接跳到岸上就直接输出
                    printf("42.50 1
    ");
                    continue;
                }
          for(i=1;i<n;i++)
          for(j=i+1;j<=n;j++) {
            minn=inf;
            minn=MIN(minn,sqrt(1.0*(ma[i].x-ma[j].x)*(ma[i].x-ma[j].x)+1.0*(ma[i].y-ma[j].y)*(ma[i].y-ma[j].y)));
            if(minn<limit+eps) {
                addedge(i,j,minn);
                addedge(j,i,minn);//双向边
            }
          }
          bfs();
         }
    return 0;
    }
    


  • 相关阅读:
    LeetCode Best Time to Buy and Sell Stock
    LeetCode Scramble String
    LeetCode Search in Rotated Sorted Array II
    LeetCode Gas Station
    LeetCode Insertion Sort List
    LeetCode Maximal Rectangle
    Oracle procedure
    浏览器下载代码
    Shell check IP
    KVM- 存储池配置
  • 原文地址:https://www.cnblogs.com/thefirstfeeling/p/4410710.html
Copyright © 2011-2022 走看看