社区讨论
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; }
}
} 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 条回复,欢迎继续交流。
正在加载回复...