Spicy Restaurant 四川省赛 (BFS,线性规划)
Gym - 103117L
思路:
- 抓住spicy值的范围只有 100,从这里入手。(很关键)
- 利用线性规划的思路分2部做,优化时间复杂度和思维难度-- 先多源BFS 找到每一个点的以某个spicy值为目标的最短距离-- 然后在线性DP一下
#includeusing 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 ) { 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; }