社区讨论

P1078 文化之旅 求助

学术版参与者 4已保存回复 6

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
6 条
当前快照
1 份
快照标识符
@mi7ymurc
此快照首次捕获于
2025/11/21 05:45
4 个月前
此快照最后确认于
2025/11/21 05:45
4 个月前
查看原帖
P1078 文化之旅
我打了一个代码,一个WA, 其他AC,正解为-1,我输出了862;
代码
#include<bits/stdc++.h> using namespace std; int n,m,k,s,t; int a[105][105],c[105]; int ha[105][105]; //仇恨 bool l[105],dd=0,b[105][105]; int ans=0x7fffffff; int bj(int x) { ans=min(ans,x); dd=1; } int dfs(int x,int sp) { if(sp<ans){ for(int i=1;i<=n;i++) { if(b[x][i]&&!l[c[i]]) { bool ll=1; for(int j=1;j<=k;j++) { if(ha[i][j]==1&&l[j]){ //判断到达的下一个点所仇恨的文化是否学过 ll=0; break; } } if(ll==1){ l[c[i]]=true; sp+=a[x][i]; b[x][i]=b[i][x]=false; if(i==t) bj(sp); else dfs(i,sp); l[c[i]]=false; sp-=a[x][i]; b[x][i]=b[i][x]=true; } } } }
}
int main() { cin>>n>>k>>m>>s>>t; int _a,_b,_d; for(int i=1;i<=n;i++) { scanf("%d",&c[i]); } for(int i=1;i<=k;i++) for(int j=1;j<=k;j++) { scanf("%d",&ha[i][j]); } memset(b,0,sizeof(b)); memset(a,0x7f,sizeof(a)); for(int i=1;i<=m;i++) { scanf("%d%d%d",&_a,&_b,&_d); if(a[_a][_b]>_d){ a[_a][_b]=a[_b][_a]=_d; b[_a][_b]=b[_b][_a]=true;
}
} if(ha[t][c[s]]==1){ //起点拥有终点所仇恨的文化,输出-1 cout<<"-1"; return 0; } for(int i=1;i<=n;i++) //减枝,减去拥有终点所仇恨的文化的点 { if(i!=t&&ha[t][c[i]]==1){ for(int j=1;j<=n;j++) b[i][j]=b[j][i]=false; } } l[c[s]]=true; dfs(s,0); if(dd==0){ cout<<"-1"; } else cout<<ans; return 0; }

回复

6 条回复,欢迎继续交流。

正在加载回复...