hdu 1245 saving james band

来源:互联网 发布:linux 断电 丢失 文件 编辑:程序博客网 时间:2024/06/05 02:12

主题思想: 根据数据构造图,然后利用图算法,求最短路径,最短路采用SPFA算法。

SPFA算法模板:

queue<int> q;int start;q.push(start);while(!q.empty()){    int now=q.front();    q.pop();    // update all node  这里是重点,更新所有节点    for(int i=0;i<n;i++){        if(dist[now]+g[now][i]<dist[i]){            dist[i]=dist[now]+g[now][i];            if(!visited[i])                {                    visited[i]=true;                    q.push(i);                }            }    }//now maybe update later; 这里也是重点,出队列后,还可能重新放进去,所以去除标记。visited[now]=false;}

参考博客:
http://blog.csdn.net/zchahaha/article/details/51029798

AC代码:

#include <iostream>#include<cstdio>#include<cstring>#include<cmath>#include<queue>#include<algorithm>using namespace std;const double INF=0x3fffffff;const double eps=1e-8;const int maxn=105;double  gx[maxn];double gy[maxn];double g[maxn][maxn];int n;double d;int pre[maxn];bool visited[maxn];double dis[maxn];void spfa(int start){    queue<int> q;    memset(visited,false,sizeof(visited));    for(int i=0;i<=n+1;i++){        dis[i]=INF;        pre[i]=-1;    }    while(!q.empty())q.pop();    q.push(start);    dis[start]=0.0;    visited[start]=true;    pre[start]=-1;    int now;    int next;    while(!q.empty()){        now=q.front();        q.pop();        //update all node        for(int i=0;i<=n+1;i++)        {            if(dis[i]>dis[now]+g[now][i]){                dis[i]=dis[now]+g[now][i];                pre[i]=now;                if(!visited[i]){                    visited[i]=true;                    q.push(i);                }            }        }        visited[now]=true;    }    if(dis[n+1]>=INF){        printf("can't be saved\n");        return ;    }    int j=n+1;    int cnt=0;    while(pre[j]!=-1){        j=pre[j];        cnt++;    }    printf("%.2lf %d\n",dis[n+1],cnt);    return;}int main(){    int x,y;    while(scanf("%d %lf",&n,&d)!=EOF){        if(n==0){            if(d>=42.5){                printf("42.5 1\n");            }else{                printf("can't be saved\n");            }            continue;        }        for(int i=1;i<=n;i++){            scanf("%lf%lf",&gx[i],&gy[i]);        }        //build the map        gx[0]=0;        gy[0]=0;        g[0][0]=0;        for(int i=0;i<=n;i++){            for(int j=i+1;j<=n;j++){                g[i][j]=sqrt((gx[i]-gx[j])*(gx[i]-gx[j])+(gy[i]-gy[j])*(gy[i]-gy[j]));                if(i==0)g[i][j]-=7.5;                if(g[i][j]<0) g[i][j]=0;                if(g[i][j]>d) g[i][j]=INF;                g[j][i]=g[i][j];            }        }        //        for(int i=0;i<=n;i++){            double c=min(50-gx[i],50-gy[i]);            c=min(c,min(50+gx[i],50+gy[i]));            if(c>d) c=INF;            g[i][n+1]=g[n+1][i]=c;        }       spfa(0);    }    return 0;}