思路:对于每个p[i] (代码中a[i].x)在适当的时间存入队列并BFS
#include <bits/stdc++.h>
using namespace std;
bool vis[200005];
int ans=0,k;
vector <int> v[200005];
struct node{
int x,y;
}a[200005];
bool cmp(node a,node b){
return a.y>b.y;
}
queue<int> q1;
queue<int> q2;
void bfs(){
int cnt=1;
q1.push(a[cnt].x);
q2.push(a[cnt].y);
vis[a[cnt].x]=true;
while(a[cnt+1].y==a[1].y&&cnt<k){
q1.push(a[cnt+1].x);
q2.push(a[cnt+1].y);
vis[a[cnt+1].x]=true;
cnt++;
}
while(!q1.empty()){
int xx=q1.front();
q1.pop();
int yy=q2.front()-1;
q2.pop();
while(a[cnt+1].y==yy&&cnt<k){
cnt++;
vis[a[cnt].x]=true;
q1.push(a[cnt].x);
q2.push(a[cnt].y);
}
if(v[xx].size()==0&&yy!=0){
q1.push(xx);
q2.push(yy);
}
for(int i=0;i<v[xx].size();i++){
if(vis[v[xx][i]]==true){
continue;
}
vis[v[xx][i]]=true;
if(yy!=0){
q1.push(v[xx][i]);
q2.push(yy);
}
}
}
}
int main()
{
int n,m,l,r;
cin>>n>>m>>k;
for(int i=1;i<=m;i++){
cin>>l>>r;
v[l].push_back(r);
v[r].push_back(l);
}
for(int i=1;i<=k;i++){
cin>>a[i].x>>a[i].y;
}
sort(a+1,a+1+k,cmp);
bfs();
for(int i=1;i<=n;i++){
if(vis[i]){
ans++;
}
}
cout<<ans<<"\n";
for(int i=1;i<=n;i++){
if(vis[i]){
cout<<i<<" ";
}
}
return 0;
}