写法:vector邻接表存图+Dijkstra求奇偶最短路(35pts
#include<bits/stdc++.h>
using namespace std;
vector<int> g[100001];
int n,m,q;
int f[100001][2];
int in[100001];
int vis[100001];
int main(){
freopen("P5663.in","r",stdin);
freopen("P5663.out","w",stdout);
memset(f,0x3f,sizeof f);
memset(vis,0,sizeof vis);
f[1][0]=0;
cin>>n>>m>>q;
for(int i=1;i<=m;i++){
int u,v;
cin>>u>>v;
g[u].push_back(v);
g[v].push_back(u);
in[u]++;
in[v]++;
}
for(int i=0;i<g[1].size();i++){
int v=g[1][i];
f[v][1]=1;
}
for(int i=1;i<=n;i++){
for(int j=0;j<g[i].size();j++){
int v=g[i][j];
if(f[i][0]+1<f[v][1]&&!vis[v]){
f[v][1]=f[i][0]+1;
}
if(f[i][1]+1<f[v][0]&&!vis[v]){
f[v][0]=f[i][1]+1;
}
vis[v]=1;
}
}
cout<<endl;
for(int i=1;i<=n;i++){
cout<<f[i][0]<<" "<<f[i][1]<<endl;
}
cout<<endl;
for(int i=1;i<=q;i++){
int a,l;
cin>>a>>l;
if(!in[a]&&l){
cout<<"No"<<endl;
continue;
}
if(l%2==0){
if(f[a][0]>l) cout<<"No"<<endl;
else cout<<"Yes"<<endl;
}
else{
if(f[a][1]>l) cout<<"No"<<endl;
else cout<<"Yes"<<endl;
}
}
return 0;
}