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;
    }
    
  • 相关阅读:
    NYOJ 625 笨蛋的难题(二)
    NYOJ 102 次方求模
    ZJU Least Common Multiple
    ZJUOJ 1073 Round and Round We Go
    NYOJ 709 异形卵
    HDU 1279 验证角谷猜想
    BNUOJ 1015 信息战(一)——加密程序
    HDU 1202 The calculation of GPA
    "蓝桥杯“基础练习:字母图形
    "蓝桥杯“基础练习:数列特征
  • 原文地址:https://www.cnblogs.com/jjl0229/p/12744442.html
Copyright © 2011-2022 走看看