zoukankan      html  css  js  c++  java
  • [bzoj5511]大中锋的游乐场

    记可乐为1,汉堡为-1,即求过程中绝对值不超过k的最短路。

    然后发现k的范围仅为10,也就是说过程中合法的值仅有21种,因此跑一遍dijspfa(嘿嘿嘿)即可。

     1 #include<bits/stdc++.h>
     2 using namespace std;
     3 #define pi pair<int,int>
     4 #define mp make_pair
     5 #define fi first
     6 #define se second
     7 #define N 10005
     8 queue<pi >q;
     9 struct ji{
    10     int nex,to,len;
    11 }edge[N*20];
    12 int E,t,n,m,k,x,y,z,ans,d[N][41],vis[N][41],head[N],p[N];
    13 void add(int x,int y,int z){
    14     edge[E].nex=head[x];
    15     edge[E].to=y;
    16     edge[E].len=z;
    17     head[x]=E++;
    18 }
    19 int main(){
    20     scanf("%d",&t);
    21     while (t--){
    22         scanf("%d%d%d",&n,&m,&k);
    23         memset(d,0x3f,sizeof(d));
    24         memset(head,-1,sizeof(head));
    25         memset(vis,0,sizeof(vis));
    26         E=0;
    27         for(int i=1;i<=n;i++){
    28             scanf("%d",&p[i]);
    29             p[i]=p[i]*2-3;
    30         }
    31         for(int i=1;i<=m;i++){
    32             scanf("%d%d%d",&x,&y,&z);
    33             add(x,y,z);
    34             add(y,x,z);
    35         }
    36         scanf("%d%d",&x,&y);
    37         d[x][p[x]+20]=0;
    38         vis[x][p[x]+20]=1;
    39         q.push(mp(x,p[x]+20));
    40         while (!q.empty()){
    41             pi o=q.front();
    42             q.pop();
    43             vis[o.fi][o.se]=0;
    44             for(int i=head[o.fi];i!=-1;i=edge[i].nex){
    45                 x=edge[i].to;
    46                 if ((abs(o.se+p[x]-20)<=k)&&(d[o.fi][o.se]+edge[i].len<d[x][o.se+p[x]])){
    47                     d[x][o.se+p[x]]=d[o.fi][o.se]+edge[i].len;
    48                     if (!vis[x][o.se+p[x]]){
    49                         q.push(mp(x,o.se+p[x]));
    50                         vis[x][o.se+p[x]]=1;
    51                     }
    52                 }
    53             }
    54         }
    55         ans=0x3f3f3f3f;
    56         for(int i=20-k;i<=k+20;i++)ans=min(ans,d[y][i]);
    57         if (ans==0x3f3f3f3f)ans=-1;
    58         printf("%d\n",ans);
    59     }
    60 }
    View Code
  • 相关阅读:
    vue+elementUI表格排序事件
    移动端flex布局
    注册发送验证码提示信息
    jquery模拟生日日期下拉选择框
    标签模拟多选择框checkbox
    vue关于组件传值
    关于前端浏览器与服务器间的交互的对比与分析
    axios的基本使用
    Promise的基本使用
    Vue Cli2 文件路径别名
  • 原文地址:https://www.cnblogs.com/PYWBKTDA/p/11250023.html
Copyright © 2011-2022 走看看