• RunningPhoton's Nightmare


    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!
    ");
    138         else printf("%d
    ",dis[cnt]);
    139     }
    140     return 0;
    141 }
  • 相关阅读:
    洛谷 P1226 【模板】快速幂||取余运算 题解
    洛谷 P2678 跳石头 题解
    洛谷 P2615 神奇的幻方 题解
    洛谷 P1083 借教室 题解
    洛谷 P1076 寻宝 题解
    洛谷 UVA10298 Power Strings 题解
    洛谷 P3375 【模板】KMP字符串匹配 题解
    Kafka Shell基本命令
    Mybatis与Hibernate的详细对比
    MyBatis简介
  • 原文地址:https://www.cnblogs.com/zgglj-com/p/6878283.html
Copyright © 2020-2023  润新知