• 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 }
  • 相关阅读:
    小M和天平(简单DP)
    前缀查询(维护字典树前缀和)
    假的字符串( trie树 + 拓扑)
    E. Two Teams(线段树+链表)
    B. Ugly Pairs(简单dfs)
    回文(牛客 https://ac.nowcoder.com/acm/problem/17062)
    Dubbo中CompletableFuture异步调用
    Dubbo消费者异步调用Future使用
    Dubbo消费者异步调用Future使用
    Dubbo服务暴露延迟
  • 原文地址:https://www.cnblogs.com/zgglj-com/p/6878283.html
Copyright © 2020-2023  润新知