主题思想: 根据数据构造图,然后利用图算法,求最短路径,最短路采用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.youkuaiyun.com/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;
}

该博客探讨了如何通过构造图并应用SPFA(Shortest Path Faster Algorithm)算法来解决HDU 1245 Saving James Band的最短路径问题。内容包括SPFA算法的模板以及实现AC代码。
642

被折叠的 条评论
为什么被折叠?



