D103 BFS最短路 P5663 [CSP-J2019] 加工零件
D103 BFS最短路 P5663 [CSP-J2019] 加工零件_哔哩哔哩_bilibili
给一个边权为 1 的无向图,相邻点之间存在奇偶性传播,q 次询问:点 a 的数取 L,其奇偶性传播到顶点 1 时 是否为 0。
思路
答案由各点到 1 的距离的奇偶性决定,那么我们就用 BFS 求出各点到 1 的奇数距离 d 和偶数距离 dd
对于询问,如果 L 是奇数且 a 点的奇数距离可达 1 或 L 是偶数且 a 点的偶数距离可达 1,那么输出 Yes,其他输出 No

图中,如果 a=5,L=3,那么传播到 1 为 0,Yes;如果 a=5,L=1,那么传播到 4 为 0,No

// 最短路+奇偶可达性 BFS 算法 O(N+M) #include<bits/stdc++.h> using namespace std; #define N 100010 int idx,h[N],to[N<<1],ne[N<<1]; void add(int x,int y){ to[++idx]=y;ne[idx]=h[x];h[x]=idx; } int n,m,q; int d[N],dd[N]; //d[u]/dd[u]表示u到1的奇数距离/偶数距离 void bfs(){ memset(d,0x3f,sizeof(d)); memset(dd,0x3f,sizeof(dd)); dd[1]=0; queue<int> q; q.push(1); while(q.size()){ int u=q.front(); q.pop(); for(int i=h[u]; i; i=ne[i]){ int v=to[i]; if(dd[v]>d[u]+1) dd[v]=d[u]+1,q.push(v); if(d[v]>dd[u]+1) d[v]=dd[u]+1,q.push(v); } } } int main(){ scanf("%d%d%d",&n,&m,&q); for(int i=1,u,v; i<=m; i++){ scanf("%d%d",&u,&v); add(u,v); add(v,u); } bfs(); for(int i=1,a,L; i<=q; i++){ scanf("%d%d",&a,&L); if(a==1 && !h[1]){ //如果1是孤立点 puts("No"); continue; } // L是奇数且a点的奇数距离可达1 或 L是偶数且a点的偶数距离可达1 if(L%2==1&&d[a]<=L || L%2==0&&dd[a]<=L)puts("Yes"); else puts("No"); } }
浙公网安备 33010602011771号