Spicy Restaurant 四川省赛 (多源BFS和其特性)
思路:
- 抓住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; }
后记;
- 当有2个元素的时候,思考从那个元素出手很重要.