zoukankan      html  css  js  c++  java
  • bzoj 2143: 飞飞侠

      1 #include<cstdio>
      2 #include<iostream>
      3 #include<queue>
      4 #define inf 1000000000
      5 #define M 155
      6 using namespace std;
      7 int xx[5]={0,1,-1,0,0},yy[5]={0,0,0,1,-1};
      8 int a[M][M],b[M][M],n,m,mx,x1,x2,y1,y2,z1,z2,a1,a2,b1,b2,c1,c2,v[M][M][2*M],d[M][M][2*M];
      9 char ch;
     10 int ans=inf;
     11 struct data
     12 {
     13     int x,y,w,w1;
     14 };
     15 bool operator>(data a,data b)
     16 {
     17     return a.w>b.w;
     18 }
     19 void dij(int x,int y)
     20 {
     21     for(int i=1;i<=n;i++)
     22       for(int j=1;j<=m;j++)
     23         for(int k=0;k<=mx;k++)
     24           {
     25             v[i][j][k]=0;
     26             d[i][j][k]=inf;
     27           }
     28     priority_queue<data,vector<data>,greater<data> >q;
     29     v[x][y][0]=1;
     30     d[x][y][a[x][y]]=b[x][y];
     31     q.push((data){x,y,b[x][y],a[x][y]});
     32     for(;!q.empty()&&(!v[x1][x2][0]||!v[y1][y2][0]||!v[z1][z2][0]);)
     33       {
     34         int x=q.top().x,y=q.top().y,w1=q.top().w1;
     35         q.pop();
     36         if(v[x][y][w1])
     37           continue;
     38         if(w1)
     39           {
     40             for(int i=0;i<5;i++)
     41               {
     42                 int a1=x+xx[i],a2=y+yy[i];
     43                 if(a1<1||a2<1||a1>n||a2>m||v[a1][a2][w1-1])
     44                   continue;
     45                 if(d[x][y][w1]<d[a1][a2][w1-1])
     46                   {
     47                     d[a1][a2][w1-1]=d[x][y][w1];
     48                     q.push((data){a1,a2,d[x][y][w1],w1-1});
     49                   }
     50               }
     51           }
     52         else
     53           if(d[x][y][a[x][y]]>d[x][y][0]+b[x][y])
     54             {
     55                 d[x][y][a[x][y]]=d[x][y][0]+b[x][y];
     56                 q.push((data){x,y,d[x][y][a[x][y]],a[x][y]});
     57             }
     58       }
     59     for(;!q.empty();q.pop());
     60     return;
     61 }
     62 int main()
     63 {
     64     scanf("%d%d",&n,&m);
     65     mx=n+m-2;
     66     for(int i=1;i<=n;i++)
     67       for(int j=1;j<=m;j++)
     68         {
     69             scanf("%d",&a[i][j]);
     70             a[i][j]=min(a[i][j],max(mx-i-j+2,i+j-2));
     71         }
     72     for(int i=1;i<=n;i++)
     73       for(int j=1;j<=m;j++)
     74         scanf("%d",&b[i][j]);
     75     scanf("%d%d%d%d%d%d",&x1,&x2,&y1,&y2,&z1,&z2);
     76     dij(x1,x2);
     77     a1=d[y1][y2][0];
     78     a2=d[z1][z2][0];
     79     dij(y1,y2);
     80     b1=d[x1][x2][0];
     81     b2=d[z1][z2][0];
     82     dij(z1,z2);
     83     c1=d[x1][x2][0];
     84     c2=d[y1][y2][0];
     85     if(b1+c1<ans)
     86       {
     87         ch='X';
     88         ans=b1+c1;
     89       }
     90     if(a1+c2<ans)
     91       {
     92         ch='Y';
     93         ans=a1+c2;
     94       }
     95     if(a2+b2<ans)
     96       {
     97         ch='Z';
     98         ans=a2+b2;
     99       }
    100     if(ans>=inf)
    101       printf("NO");
    102     else
    103       printf("%c
    %d",ch,ans);
    104     return 0;
    105 }

    分层图跑DJ

  • 相关阅读:
    Python获取Linux的家目录
    Python 批量安装包、查看当前程序依赖的包
    获取linux目录下最新的文件
    Linux破解navicat
    Linux添加PATH
    Linux下文件分析 | 命令行
    ROP | 蒸米 -x86
    Jarvis OJ | guess
    杂项入门
    Whale ctf | misc
  • 原文地址:https://www.cnblogs.com/xydddd/p/5298994.html
Copyright © 2011-2022 走看看