解题思路:

注意事项:

参考代码:

// s 和t反过来就可以ac 不然会超时

#include<iostream>
#include<set>
#include<vector>
using namespace std;
int grap[101][101];
vector<int > upset[101];    //存储文化之间的关系
int culture[101];//存储每个国家的文化
int n,k,m,s,t;
set<int> cul; //已经学了的文化
int cost=10000007;
bool findx(int x){
    for(int i=0;i<upset[x].size();i++){
        if(cul.count(upset[x][i])){
            return false;
        }
    }
    return true;
}
void dfs(int x,int sum){    //当前在x国家
    if(sum>=cost){
        return;
    }
    if(x==t){
        cost = min(cost,sum);
        return ;
    }
    for(int i=1;i<=n;i++){
        int cc = culture[i];
        if(!cul.count(cc)&&grap[x][i]!=0&&findx(cc)){
            cul.insert(cc);
            dfs(i,sum+grap[x][i]);
            cul.erase(cc);
        }
    }
}
int main(){
    cin>>n>>k>>m>>t>>s;
    for(int i=1;i<=n;i++)
        scanf("%d",&culture[i]);
    int t;
    for(int i=1;i<=k;i++){
        for(int j=1;j<=k;j++){
            scanf("%d",&t);
            if(t==1){
                upset[i].push_back(j);
            }
        }
    }
    int a,b,c;
    for(int i=1;i<=m;i++){
        scanf("%d%d%d",&a,&b,&c);
        int x = grap[a][b];
        if(x!=0&&x<c){
        }
        else{
            grap[a][b] = c;
            grap[b][a] = c;
        }
    }
    cul.insert(culture[s]);
    dfs(s,0);
    if(cost!=10000007)
        cout<<cost;
    else
        cout<<-1;
    return 0;
}

点赞(0)
 

0.0分

2 人评分

C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:

一点编程也不会写的:零基础C语言学练课程

解决困扰你多年的C语言疑难杂症特性的C语言进阶课程

从零到写出一个爬虫的Python编程课程

只会语法写不出代码?手把手带你写100个编程真题的编程百练课程

信息学奥赛或C++选手的 必学C++课程

蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程

手把手讲解近五年真题的蓝桥杯辅导课程

评论列表 共有 0 条评论

暂无评论