题目链接:加工零件
分析
40分的暴力其实很显然,直接DFS模拟每一步零件生产扩散的变化,直到原材料。看1号需不需要。
100pts居然是最短路,一开始真没想到。
其实要不要给材料与奇偶性有关,感性证明:只要两个工人之间有传送带的话,材料就会在两人之间一直递归直到提供原材料。所以,我们只要判断 d i s [ 1 , a ] dis[1,a] dis[1,a]的奇偶性以及大小。
举个例子:3号要做7阶段的零件,1要不要给材料?
那其实就是3->1有没有长度为7的路径。
我们SPFA算出1到每个点的奇数最短距离和偶数最短距离,然后判断奇偶性,比较最短路是否小于等于零件的阶段(距离),奇数就用最短奇数判断,偶数同理。
上代码
暴搜luogu35pts
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
int n,m,q,ff=0;
int tot,hd[200001];
struct node
{
int to,next;
}e[200001];
void add(int x,int y)
{
e[++tot]=(node){
y,hd[x]};
hd[x]=tot;
}
void dfs(int x,int k)
{
if(k==0) return;
for(register int i=hd[x];i>0;i=e[i].next)
{
if(e[i].to==1&&k==1) ff=1;
dfs(e[i].to,k-1);
}
}
int main()
{
cin>>n>>m>>q;
for(register int i=1;i<=m;i++)
{
int u,v;
scanf("%d%d",&u,&v);
add(u,v);
add(v,u);
}
for(register int i