P5663 [CSP-J2019] 加工零件
>>>发散式的拓展 是否存在一条 距离rt==1 的L长的路线
》》》性质-》 i存在 L长路线 -》i存在l+-=2 路线-》奇偶性+最短路
#include <bits/stdc++.h> using namespace std; const int MAXN=1005; int vex[MAXN],k,n,m,q; struct edge { int u,v,next; }e[MAXN*2]; int vis[MAXN][MAXN]; void add(int u,int v){ k++; e[k].u=u; e[k].v=v; e[k].next=vex[u]; vex[u]=k; } void dfs(int u,int s){ if(s==-1||vis[u][s]) return; vis[u][s]=1; for(int i=vex[u];i;i=e[i].next){ int v=e[i].v; dfs(v,s-1); } return; } int main(){ cin>>n>>m>>q; while(m--){ int u,v; cin>>u>>v; add(u,v); add(v,u); } while(q--){ int u,L; memset(vis,0,sizeof(vis)); cin>>u>>L; dfs(u,L); if(vis[1][0]) cout<<"Yes"<<endl; else cout<<"No"<<endl; } return 0; }
#include<cstdio> #include<iostream> #include<algorithm> #include<queue> #include<vector> #include<bits/stdc++.h> #define ll long long #define ddd printf("-----------------------\n"); using namespace std; const int maxn=1e5+10 ; struct node{ int a,l; }; queue<node> q; vector<int> g[maxn<<1]; int can[10][maxn],dis[10][maxn]; int n,m,qq; void bfs() { memset(dis,0x3f3f3f3f,sizeof(dis)); q.push((node){1,0}); can[0][1]=1,dis[0][1]=0; while(!q.empty()) { node u=q.front();q.pop(); int _a=u.a,_l=u.l; for(int i=0;i<g[_a].size();i++) { int v=g[_a][i]; if(can[(_l+1)%2][v]==0){ can[(_l+1)%2][v]=1; dis[(_l+1)%2][v]=_l+1; q.push((node){v,_l+1}); } } } } int main() { ios::sync_with_stdio(false); cin>>n>>m>>qq; for(int i=1;i<=m;i++){ int u,v;cin>>u>>v; g[u].push_back(v); g[v].push_back(u); } bfs(); for(int i=1;i<=qq;i++) { int a,l;cin>>a>>l; if(can[l%2][a]==1&&l>=dis[l%2][a]){ cout<<"Yes\n"; continue; } else{ cout<<"No\n"; continue; } } return 0; }

浙公网安备 33010602011771号