【正经题解】加工零件
2024-02-20 17:05:21
发布于:浙江
26阅读
0回复
0点赞
如果A想生产L阶段(L≥2)的零件,就需要B生产L−1阶段的零件,就需要A生产L−2阶段的零件。
所以只要一个节点生产L阶段的零件需要节点1提供原材料,这个节点生产L+2阶段的零件也需要。
所以我们记录一个点生产奇数与偶数阶段的零件,需不需要节点1提供原材料,以及L分别至少为多少就可以了。
当1是孤立点,即没有连接它的边时,如果1需要生产L阶段的零件,就没有人需要生产L−1,L−2,...,0阶段的零件,所以要输出NO。
#include<bits/stdc++.h>
using namespace std;
#define endl '\n'
int mi[2][110000];
bool can[2][110000];
vector<int> t[110000];
int n,m,Q;
struct pt
{
int a;
int l;
};
queue<pt> q;
void bfs()
{
q.push((pt){1,0});
while(!q.empty())
{
pt p=q.front();
q.pop();
int u=p.a,l=p.l;
can[l%2][u]=1;
mi[l%2][u]=l;
for(int i=0;i<t[u].size();i++)
{
int v=t[u][i];
if(!can[(l+1)%2][v])
{
can[(l+1)%2][v]=1;
mi[(l+1)%2][v]=l+1;
q.push((pt){v,l+1});
}
}
}
}
int main()
{
cin>>n>>m>>Q;
for(int i=1;i<=m;i++)
{
int a,b;
cin>>a>>b;
t[a].push_back(b);
t[b].push_back(a);
}
memset(can,0,sizeof(can));
memset(mi,127,sizeof(mi));
bfs();
for(int i=1;i<=Q;i++)
{
int a,l;
cin>>a>>l;
if(t[1].size()==0)
{
cout<<"No"<<endl;
continue;
}
if(can[l%2][a] && l>=mi[l%2][a])
{
cout<<"Yes";
}
else
{
cout<<"No";
}
cout<<endl;
}
return 0;
}
这里空空如也
有帮助,赞一个