zoukankan      html  css  js  c++  java
  • 新年好

    链接

    https://www.acwing.com/problem/content/1137/

    题目

    重庆城里有 n 个车站,m 条 双向 公路连接其中的某些车站。

    每两个车站最多用一条公路连接,从任何一个车站出发都可以经过一条或者多条公路到达其他车站,但不同的路径需要花费的时间可能不同。

    在一条路径上花费的时间等于路径上所有公路需要的时间之和。

    佳佳的家在车站 1,他有五个亲戚,分别住在车站 a,b,c,d,e。

    过年了,他需要从自己的家出发,拜访每个亲戚(顺序任意),给他们送去节日的祝福。

    怎样走,才需要最少的时间?

    输入格式
    第一行:包含两个整数 n,m,分别表示车站数目和公路数目。

    第二行:包含五个整数 a,b,c,d,e,分别表示五个亲戚所在车站编号。

    以下 m 行,每行三个整数 x,y,t,表示公路连接的两个车站编号和时间。

    输出格式
    输出仅一行,包含一个整数 T,表示最少的总时间。

    数据范围
    (1≤n≤50000, 1≤m≤105, 1<a,b,c,d,e≤n, 1≤x,y≤n, 1≤t≤100)
    输入样例:

    6 6
    2 3 4 5 6
    1 2 8
    2 3 3
    3 4 4
    4 5 5
    5 6 2
    1 6 7
    

    输出样例:

    21
    

    思路

    一定存在一组最优解,对每个点依次访问。一共只有5个点,预处理一下每两个点之间的最短路距离,再枚举一下访问顺序,复杂度(O(5!+50000k))

    代码

    #include<bits/stdc++.h>
    using namespace std;
    const int N=50010,M=2e5+10;
    int head[N],cnt;
    typedef pair<int,int> PII;
    struct eg{
        int v,c,nex;
    }edge[M];
    int a[6];
    int dis[N];
    map<int,map<int,int> >  d;
    int St[N];
    void addedge(int u,int v,int c){
        edge[++cnt]=(eg){v,c,head[u]};
        head[u]=cnt;
    }
    void spfa(int st){
        memset(dis,0x3f,sizeof dis);
        priority_queue<PII> heap;
        dis[st]=0;
        heap.push({0,st});
        while(!heap.empty()){
            int u=heap.top().second;
            heap.pop();
            for(int i=head[u];~i;i=edge[i].nex){
                int v=edge[i].v,c=edge[i].c;
                if(dis[v]>dis[u]+c){
                    dis[v]=dis[u]+c;
                    heap.push({-dis[v],v});
                }
            }
        }
        for(int i=0;i<6;++i)
            d[st][a[i]]=d[a[i]][st]=dis[a[i]];
    }
    int go[N];
    int dfs(int u,int cnt,int ans){
        if(cnt==5) return ans;
        int res=INT_MAX;
        for(int i=0;i<6;++i){
            if(go[a[i]]) continue;
            go[a[i]]=1;
            res=min(res,dfs(a[i],cnt+1,ans+d[u][a[i]]));
            go[a[i]]=0;
        }
        return res;
    }
    int main(){
        int n,m;
        cin>>n>>m;
        memset(head,-1,sizeof head);
        a[0]=1;
        for(int i=1;i<6;++i)
            cin>>a[i];
        for(int i=1;i<=m;++i){
            int u,v,c;
            cin>>u>>v>>c;
            addedge(u,v,c);
            addedge(v,u,c);
        }
        for(int i=1;i<6;++i){
            spfa(a[i]);
        }
        go[1]=1;
        cout<<dfs(1,0,0);
        return 0;
    }
    
  • 相关阅读:
    python3.6虚拟环境
    安装VMwareTools
    Vsftpd配置(Centos7)
    Sftp配置
    权限问题
    Zabbix5.0微信报警
    K8s Scheduler 在调度 pod 过程中遗漏部分节点的问题排查
    Getting Started and Beyond|云原生应用负载均衡选型指南
    混部之殇-论云原生资源隔离技术之CPU隔离(一)
    云原生技术开放日PPT大放送 | 五星级的云原生开发体验
  • 原文地址:https://www.cnblogs.com/jjl0229/p/12744442.html
Copyright © 2011-2022 走看看