`
暴风雪
  • 浏览: 385120 次
  • 性别: Icon_minigender_2
  • 来自: 杭州
社区版块
存档分类
最新评论

[SPFA+精度控制]hdoj 1245:Saving James Bond

阅读更多

大致题意:
    给出一个100*100的池塘,池塘中心位于二维坐标原点。池塘中心有一个直径为15的圆形岛屿,一个人站在岛屿上。给出池塘中n个小岛的位置和这个人的最大步长。求这个人想到池塘对岸的话最少要走多长的距离,最少要迈多少步。

 

大致思路:
    把小岛抽象为起点,对岸抽象为终点,求最短路即可。最短路的思路很好想到,但是需要精度控制的经验啊。

 

 

#include<iostream>
#include<cmath>
#include<cstdio>
#include<fstream>
#include<cstring>
using namespace std;
const int nMax=100050;
const int mMax=1000050;
const int inf=1<<30;
const double eps=1e-12;
struct{
    int v, next;
    double  w;
}edge[mMax];
int n,k,edgeHead[nMax];
double dis[nMax];
int stack[nMax],m;
bool vis[nMax];

int steps[nMax];

void addedge(int a,int b,double w){
    edge[k].w = w;
    edge[k].v=b;
    edge[k].next=edgeHead[a];
    edgeHead[a]=k;k++;
}

int spfa(int s){
    int i, top = 0;
    memset(vis,0,sizeof(vis));
    for(i=1;i<=n;i++){
        dis[i]=inf;
        steps[i]=inf;
    }
    dis[s]=steps[s]=0;
    stack[++top]=s;
    vis[s]=true;
    while(top){
        int u=stack[top--];
        vis[u]=false; /////////////////
        for(i=edgeHead[u];i!=0;i=edge[i].next){
            int v=edge[i].v;
            if(abs(dis[v]-(dis[u]+edge[i].w))<=eps){
                if(steps[v]>steps[u]+1){
                    steps[v]=steps[u]+1;
                    if(!vis[v]){
                        vis[v]=true;
                        stack[++top]=v;
                    }
                }
                continue;
            }
            if(dis[v]>dis[u]+edge[i].w){
                dis[v]=dis[u]+edge[i].w;
                steps[v]=steps[u]+1;
                if(!vis[v]){
                    vis[v]=true;
                    stack[++top] = v;
                }
            }
        }
    }
    int sum=0;
    for(i=1;i<=n;i++){
        sum+=dis[i];
    }
    return sum;
}

class fuck{
    public:
    int x,y;
}node[nMax];
int len;

double getdis(int a,int b){
    return sqrt((node[a].x-node[b].x)*(node[a].x-node[b].x)+(node[a].y-node[b].y)*(node[a].y-node[b].y));
}

int main(){
    int i,j,s,t;
    double d,e;
    node[0].x=node[0].y=0;
  //  freopen("gift.in","r",stdin);
    while(scanf("%d%d",&n,&len)!=EOF){
        k=1;
        memset(edgeHead,0,sizeof(edgeHead));
        for(i=1;i<=n;i++){
            scanf("%d%d",&node[i].x,&node[i].y);
        }
        for(i=1;i<=n;i++){
            for(j=1;j<=n;j++){
                if(i==j)continue;
                d=getdis(i,j);
            //    cout<<d<<endl;
                if(d<=len){
                    addedge(i,j,d);
                }
            }
        }
        s=n+1;
        t=n+2;
        for(i=1;i<=n;i++){
            d=getdis(0,i)-7.5;
            if(d<=len){
                addedge(s,i,d);
            }
            d=min(50-node[i].x,50-node[i].y);
            e=min(node[i].x+50,node[i].y+50);
            d=min(d,e);
            if(d<=len){
                addedge(i,t,d);
            }
        }
        n+=2;
        spfa(s);
        if(fabs(dis[t]-inf)<=eps){
            printf("can't be saved\n");
            continue;
        }
        printf("%.2f %d\n",dis[t],steps[t]);
    }
    return 0;
}
0
0
分享到:
评论

相关推荐

    设施选址算法模型:spfa+最小费用最大流+(二进制粒子群优化算法量子行为粒子群优化算法遗传算法_CodeCraft.zip

    设施选址算法模型:spfa+最小费用最大流+(二进制粒子群优化算法量子行为粒子群优化算法遗传算法_CodeCraft

    SPFA+Dijkstra+Floyd Java模板

    SPFA import java.util.Arrays; import java.util.LinkedList; import java.util.Queue; import java.util.Scanner; public class SPFA { static SE[] e = new SE[9999]; static int[] dis = new int[9999]; ...

    SPFA.zip_SPFA

    标题中的"SPFA.zip_SPFA"表明这是一个与SPFA算法相关的压缩文件,SPFA全称为Shortest Path Faster Algorithm,即最短路径更快算法。这是一种解决图论中的单源最短路径问题的算法,通常用于有向图。描述提到SPFA算法...

    c++ SPFA算法

    C++ SPFA算法 SPFA(Shortest Path Faster Algorithm)是一种求解单源最短路径问题的算法,它可以在O(kE)的时间复杂度内求出源点到其他所有点的最短路径,并且可以处理负边。该算法的基本思想是使用一个队列来维护...

    spfa算法的java实现

    SPFA(Shortest Path Faster Algorithm)算法是一种求解图中单源最短路径问题的算法,它是Bellman-Ford算法的一种优化版本。在Java中实现SPFA算法,我们需要理解其核心思想并熟悉Java编程语法。 SPFA算法的主要优点...

    SPFA.rar_SPFA_最短路径

    SPFA(Shortest Path Faster Algorithm)是最短路径算法的一种,主要应用于图论和网络流问题中,用于寻找从源节点到图中所有其他节点的最短路径。SPFA算法是Bellman-Ford算法的一种优化版本,它在处理负权边的情况下...

    SPFA算法优化及应用

    "SPFA算法优化及应用" SPFA(Shortest Path Faster Algorithm)是一种高效的单源最短路算法,广泛应用于图论和动态规划等领域。下面是对SPFA算法的详细介绍和优化。 基本实现 SPFA算法的基本思想是通过relax操作...

    SPFA.rar_SPFA_problem solving

    标题中的"SPFA.rar_SPFA_problem solving"指出我们要探讨的是一个与SPFA算法相关的问题解决过程。SPFA,即Shortest Path Faster Algorithm(最短路径更快算法),是用于解决图论中的单源最短路径问题的一种算法。它...

    SPFA.zip_SPFA_稀疏矩阵路径

    SPFA(Shortest Path Faster Algorithm)算法是一种基于队列的数据结构优化版的Bellman-Ford算法,主要用于解决图论中的单源最短路径问题。它在处理稀疏矩阵时表现出较高的效率,尤其适用于边数量远小于顶点数量平方...

    关于最短路径的SPFA快速算法_段凡丁1

    【SPFA算法详解】 SPFA(Shortest Path Faster Algorithm)是一种用于解决图中单源最短路径问题的算法,由段凡丁在1994年提出。它采用了动态优化逼近的思想,相比于经典的Dijkstra算法,在某些情况下表现出更好的...

    SPFA算法.doc

    SPFA(Shortest Path Faster Algorithm)算法是一种用于解决图论中的单源最短路径问题的算法,它是贝尔曼-福特(Bellman-Ford)算法的一种优化版本,主要应用于求解带有负权重边的图的最短路径。SPFA通过使用队列...

    求单源点最短路径效率很高的spfa算法

    **SPFA算法详解** SPFA(Shortest Path Faster Algorithm)是一种用于解决图论中的单源最短路径问题的算法,由姚一兆提出。相比于Dijkstra算法,SPFA在处理某些稠密图时表现出更高的效率,尽管它不是一种确定性的...

    SPFA算法源代码

    这里是SPFA的源代码

    最短路径 之 SPFA算法

    SPFA最短路径算法 SPFA(Shortest Path Faster Algorithm)是一种单源最短路径算法,它的性能非常好,代码实现也并不复杂。特别是当图的规模大,用邻接矩阵存不下的时候,用 SPFA 则可以很方便地面对临接表。每个...

    spfa.rar_SPFA

    **SPFA算法详解** SPFA(Shortest Path Faster Algorithm)是一种用于解决图论中的单源最短路径问题的算法,由姚新在2001年提出。它是一种改进的Bellman-Ford算法,旨在提高求解效率。与Bellman-Ford算法每次迭代...

    SPFA.rar_SPFA

    **SPFA算法详解** SPFA(Shortest Path Faster Algorithm,最短路径更快算法)是一种用于解决图论中的单源最短路径问题的算法,由美国伊利诺伊大学香槟分校的王浩教授提出。与Dijkstra算法不同,SPFA算法在某些情况...

    SPFA[知乎:叶枝黎曼].py

    SPFA[知乎:叶枝黎曼].py

    SPFA.cpp SPFA算法

    最短路SPFA算法。SPFA(Shortest Path Faster Algorithm)算法是求单源最短路径的一种算法,它是Bellman-ford的队列优化,它是一种十分高效的最短路算法。存在负权边时使用。

Global site tag (gtag.js) - Google Analytics