Spicy Restaurant 四川省赛 (多源BFS和其特性)

Gym - 103117L

思路:

  • 抓住spicy值的范围只有 100,从这里入手。
  • 元素思考的对换,有店和人,从人出手,不好想,从满足情况的店出手就很好想了,
  • 枚举 spicy值, 当前的火锅店的值<=spicy就入队列, 多源BFS , 这样就能保证是最短的距离.(边大小都是1的时候,bfs的特性先更行,距离短)

 

   

#include <bits/stdc++.h>
using namespace std;
#define ri register int
#define M 100005

template <class G>void read(G &x)
{
    x=0;int f=0;char ch=getchar();
    while(ch<'0'||ch>'9'){f|=ch=='-';ch=getchar();}
    while(ch>='0'&&ch<='9'){x=(x<<1)+(x<<3)+(ch^48);ch=getchar();}
    x=f?-x:x;
    return ;
} 

int n,m,T;

vector <int> p[M];
int val[M];
int dis[105][M];
int inf;

void bfs(int c)
{
    queue<int>q;
    for(ri i=1;i<=n;i++)
    {
        if(val[i]==c)
        {
            q.push(i);
            dis[c][i]=0;
        }
    }
    while(!q.empty())
    {
        int a=q.front();q.pop();
        for(ri i=0;i<p[a].size();i++)
        {
            int b=p[a][i];
            if(dis[c][b]!=inf) continue;
            dis[c][b]=dis[c][a]+1;
            q.push(b);
        }
    }
    
    
}
int main(){
    
    read(n);read(m);read(T);
    for(ri i=1;i<=n;i++)
    {
        read(val[i]);
    }
    for(ri i=1;i<=m;i++)
    {
        int a,b;
        read(a);read(b);
        p[a].push_back(b);
        p[b].push_back(a);
    }
    memset(dis,0x3f,sizeof(dis));
    inf = dis[0][0];
    
    for(ri i=1;i<=100;i++) bfs(i);
    for(ri i=1;i<=n;i++)
    for(ri j=2;j<=100;j++)
    {
        dis[j][i]=min(dis[j-1][i],dis[j][i]);
    }
    
    while(T--)
    {
        int a,b;
        read(a);read(b);
        if(dis[b][a]==inf) printf("-1\n");
        else 
        printf("%d\n",dis[b][a]);
    }
    return 0;
    
}
View Code

 后记;

  • 当有2个元素的时候,思考从那个元素出手很重要.
posted @ 2022-03-01 10:14  VxiaohuanV  阅读(87)  评论(0编辑  收藏  举报