社区讨论
DFS玄学剪枝80分WA求助
P5683[CSP-J 2019 江西] 道路拆除参与者 3已保存回复 4
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 4 条
- 当前快照
- 1 份
- 快照标识符
- @lo7ugwg4
- 此快照首次捕获于
- 2023/10/27 07:57 2 年前
- 此快照最后确认于
- 2023/10/27 07:57 2 年前
思路和第四篇题解差不多
CPP#include <bits/stdc++.h>
using namespace std;
int n,m;
const int N=3005;
int u,v;
int head[N],ecnt;
int s1,t1,s2,t2;
int dis[N],dis2[N];
int ans=0x3f3f3f3f3f,sum;
bool flag[N];
int f_ans=0;
struct edge{
int v,nxt;
}e[N<<1];
void add(int u,int v){
e[ecnt].v=v;
e[ecnt].nxt=head[u];
head[u]=ecnt++;
}
void spfa(){
memset(dis,0x3f,sizeof(dis));
memset(dis2,0x3f,sizeof(dis2));
queue<int> q;
q.push(s1);
dis[s1]=0;
while(!q.empty()){
int u=q.front();
q.pop();
for(int i=head[u];i+1;i=e[i].nxt){
int v=e[i].v;
if(dis[v]>dis[u]+1){
dis[v]=dis[u]+1;
q.push(v);
}
}
}
q.push(s2);
dis2[s2]=0;
while(!q.empty()){
int u=q.front();
q.pop();
for(int i=head[u];i+1;i=e[i].nxt){
int v=e[i].v;
if(dis2[v]>dis2[u]+1){
dis2[v]=dis2[u]+1;
q.push(v);
}
}
}
}
void dfs2(int u,int fa,int d){
if(sum>ans) return ;
if(u==s2){
ans=min(ans,sum);
return ;
}
for(int i=head[u];i+1;i=e[i].nxt){
int v=e[i].v;
if(v==fa||dis2[v]+d>t2) continue;
int k=1;
if(flag[i/2]==1) k=0;
flag[i/2]=true;
sum+=k;
dfs2(v,u,d+1);
sum-=k;
if(k==1) flag[i/2]=false;
}
}
void dfs(int u,int fa,int d){
if(u==s1){
dfs2(1,-1,0);
return ;
}
for(int i=head[u];i+1;i=e[i].nxt){
int v=e[i].v;
if(v==fa||dis[v]+d>t1) continue;
sum++;
flag[i/2]=true;
dfs(v,u,d+1);
sum--;
flag[i/2]=false;
}
}
int main(){
cin>>n>>m;
memset(head,-1,sizeof(head));
for(int i=1;i<=m;i++){
cin>>u>>v;
add(u,v);
add(v,u);
}
cin>>s1>>t1>>s2>>t2;
spfa();
if(dis[1]>t1||dis2[1]>t2){
cout<<-1;
return 0;
}
dfs(1,-1,0);
cout<<m-ans;
}
回复
共 4 条回复,欢迎继续交流。
正在加载回复...