P8604 [蓝桥杯 2013 国 C] 危险系数 题解
说句闲话,《地道战》似乎是我小学时语文老师喊我们看过的电影。
好了,现在进入正题。
1.题目大意:
给你
2.分析:
这道题的
首先,深搜的变量有两个:
dfs(sx/*这是起点*/,0);
我们用
void dfs(int x,int cnt){
a[cnt]=x;
flag[x]=1;
if(x==ex){//到达终点,返回
……
return;
}
int l=g[x].size();//vector存图
for(int i=0;i<l;i++){
int y=g[x][i];
if(!flag[y]){//如果这个点没走过就走
dfs(y,cnt+1);
}
}
a[cnt]=0;
flag[x]=0;//回溯
}
现在,有同学就发现,返回这里省略了。哦,我们答案没法输出啊。
我们可以这么办:对于每种到达终点的路线,每一步都对应唯一的点。如果所有的路线都经过了一个点,说明这个点一定得走到。
于是,省略的部分出来了:
s++;
for(int i=0;i<=cnt;i++){
t[a[i]]++;
}
a[cnt]=0;
flag[x]=0;
这里的
注意两点:这里的
最后的输出就很简单了:
for(int i=1;i<=n;i++){
if(t[i]==s){
ans++;
}
}
cout<<ans-2;
只需注意一点:由于起点和终点不算,所以
完整代码就不给啦,记得加双向边哦~