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 这题是错题,没得多项式做法,不知道自己当时在些什么
posted @ 2023-06-17 22:35  haozexu  阅读(16)  评论(0)    收藏  举报