P1078 文化之旅
P1078 文化之旅
题意很冗长,要仔细读一读
但是当你战战兢兢读完题时,看看数据范围 -->>
对于 100%的数据,有2≤N≤100
1≤K≤100
1≤M≤N^2
这......?认真的?普及组T4?
直接给他上一套dfs,成功AC
AC Code
#include<bits/stdc++.h>
using namespace std;
const int N=105;
int n,k,m,s,t;
int a[N][N],c[N];
bool studied[N],vis[N];
int tot,head[N],ans=0x3f3f3f3f;
struct edge{
int v,w,next;
}e[4*N*N];
void add(int u,int v,int w){
e[++tot]={v,w,head[u]};
head[u]=tot;
}
bool check(int x){
if(studied[c[x]]||vis[x]) return false;
for(int i=1;i<=k;i++){
if(studied[i]&&a[c[x]][i]){
return false;
}
}
return true;
}
void dfs(int x,int now){
if(x==t){
ans=min(ans,now);
return;
}
vis[x]=true;
studied[c[x]]=true;
for(int i=head[x];i;i=e[i].next){
if(check(e[i].v)){
dfs(e[i].v,now+e[i].w);
}
}
return;
}
int main(){
cin>>n>>k>>m>>s>>t;
for(int i=1;i<=n;i++){
cin>>c[i];
}
for(int i=1;i<=k;i++){
for(int j=1;j<=k;j++){
cin>>a[i][j];
}
}
for(int i=1;i<=m;i++){
int u,v,w;cin>>u>>v>>w;
add(u,v,w);
}
dfs(s,0);
if(ans==0x3f3f3f3f) cout<<"-1";
else cout<<ans;
return 0;
}
说实话,在考试时想不出正解是,用这样的暴力很管用,至少能得到Subtask1大约10-30pts,正解呢?题解区大佬说是启发式搜索,咱们也不会,就水水绿题就可以了。
感言
为啥我的随机跳题总能跳到水题?
Update 2023.6.17 这题是错题,没得多项式做法,不知道自己当时在些什么
本文来自博客园,作者:haozexu,转载请注明原文链接:https://www.cnblogs.com/haozexu/p/17488413.html

浙公网安备 33010602011771号