首页 > 技术文章 > RunningPhoton's Nightmare

zgglj-com 2017-05-19 14:37 原文

1.orzzzzz,不知道BFS为啥不对!!!!非要改成SPFA。。。

2.经典套路,对时间装置重置点,起点和终点都跑一遍BFS,建一张图,然后在图上从起点到终点跑一遍SPFA,答案就出来了。

3.建图的时候两点之间的距离小于K才放进去。

4.QAQ,终于搞明白了。。BFS跑单位边权的图返回的才一定是最优解。

  1 #include<iostream>
  2 #include<algorithm>
  3 #include<cstdio>
  4 #include<cstring>
  5 #include<queue>
  6 using namespace std;
  7 typedef pair<int,int> P;
  8 
  9 const int INF=100000000;
 10 
 11 char map[605][605];
 12 int N,M;
 13 int sx,sy;
 14 int gx,gy;
 15 
 16 int T,k,tot,cnt;
 17 int d[605][605],head[200],vis[200],dis[200],p[200][2];
 18 int dx[4]={1,0,-1,0},dy[4]={0,1,0,-1};
 19 
 20 struct edge{
 21     int to,next;
 22     int w;
 23 }e[40000];
 24 
 25 void e_init(){
 26     tot=0;
 27     memset(head,-1,sizeof(head));
 28 }
 29 
 30 void addedge(int u,int v,int w){
 31     e[tot].to=v;
 32     e[tot].w=w;
 33     e[tot].next=head[u];
 34     head[u]=tot++;
 35 }
 36 
 37 void init(int np,int m_sx,int m_sy){
 38     queue<P> q;
 39     for(int i=0;i<N;i++){
 40         for(int j=0;j<M;j++)
 41             d[i][j]=INF;
 42     }
 43     q.push(P(m_sx,m_sy));
 44     d[m_sx][m_sy]=0;
 45     
 46     while(q.size()){
 47         P p=q.front();
 48         q.pop();
 49         for(int i=0;i<4;i++){
 50             int nx=p.first+dx[i],ny=p.second+dy[i];
 51             if(0<=nx&&nx<N&&0<=ny&&ny<M&&map[nx][ny]!='W'&&d[nx][ny]==INF){
 52                  q.push(P(nx,ny));
 53                  d[nx][ny]=d[p.first][p.second]+1;
 54             }
 55         }
 56     }
 57     for(int i=0;i<=cnt;i++){
 58         int mx=p[i][0],my=p[i][1];
 59         if(i==np||d[mx][my]>=k) continue;
 60         addedge(np,i,d[mx][my]);
 61     }
 62 }
 63 void SPFA(int st){
 64     for(int i=1;i<=cnt;i++){
 65         dis[i]=INF;
 66         vis[i]=0;
 67     }
 68     dis[st]=0;
 69     vis[st]=1;
 70     queue<int> q;
 71     q.push(st);
 72     while(q.size()){
 73         int v=q.front();
 74         q.pop();
 75         for(int i=head[v];i!=-1;i=e[i].next){
 76             int t=e[i].to;
 77             if(dis[t]>dis[v]+e[i].w){
 78                 dis[t]=dis[v]+e[i].w;
 79                 if(!vis[t]){
 80                     q.push(t);
 81                     vis[t]=1;
 82                 }
 83             }
 84         }
 85         vis[v]=0;
 86     }    
 87 }
 88 /*
 89 int BFS(int st,int en){
 90     queue<int> q;
 91     memset(dis,0,sizeof(dis));
 92     memset(vis,0,sizeof(vis));
 93     
 94     q.push(st);
 95     vis[st]=1;
 96     while(q.size()){
 97         int v=q.front();
 98         q.pop();
 99         for(int i=head[v];i!=-1;i=e[i].next){
100             int t=e[i].to;
101             if(!vis[t]){
102                 vis[t]=1;
103                 dis[t]=dis[v]+e[i].w;
104                 if(t==en) return dis[en];
105                 q.push(t);
106             }
107         }
108     }
109     return -1;
110 }
111 */
112 int main()
113 {   scanf("%d",&T);
114     while(T--){
115         cnt=0;
116         e_init();
117         scanf("%d%d%d",&N,&M,&k);
118         memset(p,0,sizeof(p));
119         for(int i=0;i<N;i++){
120             for(int j=0;j<M;j++){
121                 cin>>map[i][j];
122                 if(map[i][j]=='S') sx=i,sy=j;
123                 if(map[i][j]=='E') gx=i,gy=j;
124                 if(map[i][j]=='R'){
125                     cnt++;
126                     p[cnt][0]=i;
127                     p[cnt][1]=j;
128                 }
129             }
130             getchar(); 
131         }
132         cnt++;
133         p[0][0]=sx,p[0][1]=sy,p[cnt][0]=gx,p[cnt][1]=gy;
134         for(int i=0;i<=cnt;i++) 
135             init(i,p[i][0],p[i][1]);
136         SPFA(0);   
137         if(dis[cnt]==INF) printf("Poor RunningPhoton!\n");
138         else printf("%d\n",dis[cnt]);
139     }
140     return 0;
141 }

 

推荐阅读