2 solutions

  • 0
    @ 2026-8-6 21:14:18
    #include<bits/stdc++.h>
    using namespace std;
    const int N=110,INF=0x3f3f3f3f;
    int n,k,m,s,t;
    int c[N],dist[N];//文化和到某个国家的距离
    int a[N][N],g[N][N];//文化是否冲突和能否走到某个国家
    bool h[N];//是否学习过某个文化
    void dfs(int u,int d){
    	if(d>=dist[u]||d>=dist[t]) return ;
    	dist[u]=d;
    	if(u==t) return ;
    	for(int i=1;i<=n;i++){
    		if(g[u][i]==INF) continue;
    		if(h[c[i]]) continue;
    		bool flag=1;
    		for(int j=1;j<=k;j++){
    			if(h[j]&&a[j][c[i]]==1){
    				flag=0;
    				break;
    			}
    		}
    		if(flag){
    			h[c[i]]=1;
    			dfs(i,d+g[u][i]);
    			h[c[i]]=0;
    		}
    	}
    }
    int main(){
    	ios::sync_with_stdio(false);
    	cin.tie(nullptr);
    	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];
    		}
    	}
    	memset(dist,0x3f,sizeof dist);
    	memset(g,0x3f,sizeof g);
    	for(int i=1;i<=n;i++){
    		g[i][i]=0;
    	}
    	for(int i=1;i<=m;i++){
    		int a,b,c;
    		cin>>a>>b>>c;
    		g[a][b]=g[b][a]=min(g[a][b],c);
    	}
    	h[c[s]]=1;
    	dfs(s,0);
    	if(dist[t]==INF){
    		cout<<-1;
    	}
    	else{
    		cout<<dist[t];
    	}
    	return 0;
    }
    

    Information

    ID
    440
    Time
    1000ms
    Memory
    128MiB
    Difficulty
    6
    Tags
    # Submissions
    16
    Accepted
    6
    Uploaded By