Ural1254(SPFA)

来源:互联网 发布:如何做读书笔记 知乎 编辑:程序博客网 时间:2024/06/05 05:11

因为距离不同所以不能用广搜。

#include <iostream>#include <cstdio>#include <algorithm>#include <cstring>#include <cmath>#include <queue>using namespace std;int n,m,k;double v;char c[76][76];int vstd[6000];double d[6000];int dirx[]={-1,-1,-1,0,1,1,1,0};int diry[]={-1,0,1,1,1,0,-1,-1};const int INF=0xffffff;double dis[]={sqrt(2),1};bool ok(int x,int y){return (x>=0 && x<m && y>=0 && y<n);}void init(){int i;for (i=0;i<m*n;i++)d[i]=INF;}int main(){scanf("%d%d%d%lf",&n,&m,&k,&v);int i,j;for (i=0;i<m;i++)scanf("%s",c[i]);int x0,y0;int x,y;scanf("%d%d",&y0,&x0);x0--;y0--;double total=0;for (i=0;i<k;i++){memset(vstd,0,sizeof(vstd));init();scanf("%d%d",&y,&x);x--;y--;int u=x0*n+y0;int ans=x*n+y;vstd[u]=1;d[u]=0;queue<int> Q;Q.push(u);while (!Q.empty()){int front=Q.front();int xx=front/n;int yy=front%n;for (j=0;j<8;j++){int uu=xx+dirx[j];int vv=yy+diry[j];u=uu*n+vv;if (ok(uu,vv)  && c[uu][vv]=='.' && d[front]+dis[j%2]<d[u]){d[u]=d[front]+dis[j%2];if (!vstd[u]){Q.push(u);vstd[u]=1;}}}vstd[front]=0;Q.pop();}if (d[ans]!=INF){x0=x;y0=y;total+=d[ans];}}printf("%.2f\n",total/v);}


0 0