朴素dfs 40tps 求调
查看原帖
朴素dfs 40tps 求调
750689
CNzzc楼主2024/9/10 22:24
#include<bits/stdc++.h>
#define ll long long
#define endl '\n'
#define up(i,j,k,l) for(int i=j;i<=k;i+=l)
#define down(i,j,k,l) for(int i=j;i>=k;i-=l)
using namespace std;
const int N=1e2+10;
int n,k,m,s,t;
int c[N],a[N][N],p[N][N],z[N];
bool f[N];
int ans;
bool check(int x)
{
	up(i,1,n,1){
		if(a[c[x]][i] && z[i]>0){
			return false;
		}
	}
	return true;
} 
void dfs(int u,int ct)
{
	//cout<<u<<endl;
	if(u==t){
		//cout<<"DDD"<<endl;
		ans=min(ans,ct);
		//cout<<ans<<' '<<ct<<endl;
		return;
	}
	z[c[u]]++;
	f[u]=true;
	up(i,1,n,1){
		if(p[u][i]!=INT_MAX && f[i]==false && check(i)){
			//cout<<u<<' '<<i<<' '<<p[u][i]<<endl;
			dfs(i,ct+p[u][i]);
		}
	}
	f[u]=false;
	z[c[u]]--;
	return;
}
void solve()
{
	cin>>n>>k>>m>>s>>t;
	up(i,1,n,1){
		cin>>c[i];
	}
	up(i,1,k,1){
		up(j,1,k,1){
			cin>>a[i][j];
		}
	}
	int u,v,d;
	up(i,0,N-1,1){
		up(j,0,N-1,1){
			p[i][j]=INT_MAX;
		}
	}
	up(i,1,m,1){
		cin>>u>>v>>d;
		p[u][v]=min(p[u][v],d);
	}
	ans=INT_MAX;
	dfs(s,0);
	if(ans!=INT_MAX){
		cout<<ans;
	}
	else{
		cout<<-1;
	}
    return;
}
int main()
{
    //ios::sync_with_stdio(false);
    //cin.tie(0);
    //freopen(".in","r",stdin);
    //freopen(".out","w",stdout);
    int _=1;
    //cin>>_;
    while(_--){
        solve();
    }
    return 0;
}
2024/9/10 22:24
加载中...