是这样的
本蒟蒻正在复习最短路
然后打了这题结果样例一没过
改了大半天没发现那里不对想着交一发
然后一发过了。。
#include<bits/stdc++.h>
#define N 100010
using namespace std;
int n,m,c,cnt=0;
int head[N<<1],nxt[N<<1],to[N<<1];
int dis[N][2],vis[N][2]={};
struct node{
int d,num;
bool operator <(const node &x)const
{
return x.d<d;
}
};
void add(int u,int v){
to[++cnt]=v;
nxt[cnt]=head[u];
head[u]=cnt;
}
priority_queue<node>q;
void dijkstra(){
for(int i=1;i<=m;i++)dis[i][0]=1e9,dis[i][1]=1e9;
dis[1][0]=0;
q.push((node){0,1});
while(!q.empty()){
node tmp=q.top();q.pop();
int x=tmp.num;
for(int i=head[x];i;i=nxt[i]){
int y=to[i];
if(dis[y][0]>dis[x][1]+1){
dis[y][0]=dis[x][1]+1;
if(!vis[y][0]){
vis[y][0]=1;
q.push((node){dis[y][0],y});
}
}
if(dis[y][1]>dis[x][0]+1){
dis[y][1]=dis[x][0]+1;
if(!vis[y][1]){
vis[y][1]=1;
q.push((node){dis[y][1],y});
}
}
}
}
}
int main(){
cin>>n>>m>>c;
for(int i=1;i<=m;i++){
int x,y;
cin>>x>>y;
add(x,y);
add(y,x);
}
dijkstra();
for(int i=1;i<=c;i++){
int x,y;
cin>>x>>y;
if(!head[1]){
cout<<"No"<<endl;
continue;
}
else if(dis[x][y%2]<=y)cout<<"Yes"<<endl;
else cout<<"No"<<endl;
}
return 0;
}
以上代码应简单易懂 救一救啊qwq