gym103117L. Spicy Restaurant
Posted Jozky86
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了gym103117L. Spicy Restaurant相关的知识,希望对你有一定的参考价值。
题意:
有n个点,m个边,每个点都有一个能量值,现在有q个人,每个人有自己的能量值,现在每个人都要去离自己最近且能量值小于等于自身的点。
1<=n,m<=1e5
1<=q<=5e5
1
<
=
w
i
<
=
100
1<=w_{i}<=100
1<=wi<=100
题解:
按照题目意思,对于q个人我们都要跑一次最短路,直接爆掉
我们注意到,wi很小范围是100以内,那我们可以这样,对于辣味x,如果有三个点辣味等于x,我们可以以他们为起点,然后跑bfs,去更新与其他点的距离,这样跑完相当于知道了其他点到辣味x的城市的最近距离。d[i][j]:表示点j到最近的辣味为i的点之间的距离,然后将dis[i][j]=min(dis[i-1][j],dis[i][j])顺着更新(因为可以到达辣度小于等于i的点)
辣味x只需要从1循环到100,每次跑多源bfs。最后询问时直接查询即可
总复杂度是O(100(n+m)+100n+q)
代码:
我一开始输出用的cout,直接被卡了
#include <bits/stdc++.h>
#include <unordered_map>
#define debug(a, b) printf("%s = %d\\n", a, b);
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int, int> PII;
clock_t startTime, endTime;
//Fe~Jozky
const ll INF_ll= 1e18;
const int INF_int= 0x3f3f3f3f;
void read(){};
template <typename _Tp, typename... _Tps> void read(_Tp& x, _Tps&... Ar)
{
x= 0;
char c= getchar();
bool flag= 0;
while (c < '0' || c > '9')
flag|= (c == '-'), c= getchar();
while (c >= '0' && c <= '9')
x= (x << 3) + (x << 1) + (c ^ 48), c= getchar();
if (flag)
x= -x;
read(Ar...);
}
template <typename T> inline void write(T x)
{
if (x < 0) {
x= ~(x - 1);
putchar('-');
}
if (x > 9)
write(x / 10);
putchar(x % 10 + '0');
}
void rd_test()
{
#ifdef ONLINE_JUDGE
#else
startTime = clock ();
freopen("data.in", "r", stdin);
#endif
}
void Time_test()
{
#ifdef ONLINE_JUDGE
#else
endTime= clock();
printf("\\nRun Time:%lfs\\n", (double)(endTime - startTime) / CLOCKS_PER_SEC);
#endif
}
const int maxn=200010;
int w[maxn];
vector<int>vec[maxn];
int dis[102][maxn];
int vis[maxn];
int n,m,q;
void bfs(int x){
queue<int>q;
for(int i=1;i<=n;i++){
vis[i]=0;
if(w[i]==x){
q.push(i);
dis[x][i]=0;
}
}
while(!q.empty()){
int u=q.front();
q.pop();
// vis[u]=1;
for(auto v:vec[u]){
if(vis[v])continue;
vis[v]=1;
dis[x][v]=min(dis[x][u]+1,dis[x][v]);
q.push(v);
}
}
}
int main()
{
rd_test();
read(n,m,q);
for(int i=1;i<=n;i++){
for(int j=0;j<=100;j++){
dis[j][i]=INF_int;
}
}
for(int i=1;i<=n;i++)read(w[i]);
for(int i=1;i<=m;i++){
int u,v;
read(u,v);
vec[u].push_back(v);
vec[v].push_back(u);
}
for(int i=1;i<=100;i++)
bfs(i);
for(int i=1;i<=n;i++){
for(int j=1;j<=100;j++){
dis[j][i]=min(dis[j][i],dis[j-1][i]);
}
}
for(int i=1;i<=q;i++){
int p,a;//位置 辣度
read(p,a);
printf("%d\\n",(dis[a][p]==INF_int?-1:dis[a][p]));
}
return 0;
//Time_test();
}
以上是关于gym103117L. Spicy Restaurant的主要内容,如果未能解决你的问题,请参考以下文章