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

    绵阳城里有n个车站,m条双向公路连接其中的某些车站。每两个车站最多用一条公路连接,从任何一个车站出发都可以经过一条或者多条公路到达其他车站,但不同的路径需要花费的时间可能不同。在一条路径上花费的时间等于路径上所有公路需要的时间之和。 佳佳的家在车站1,他有五个亲戚,分别住在车站a,b,c,d,e。过年了,他需要从自己的家出发,拜访每个亲戚(顺序任意),给他们送去节日的祝福。怎样走,才需要最少的时间?

    输入

      第一行:n(n<=50,000),m(m<=100,000)为车站数目和公路的数目。
    第二行:a,b,c,d,e,为五个亲戚所在车站编号(1<=n)。
    以下m行,每行三个整数x,y,t(1<=x,y<=n,1<=t<=100),为公路连接的两个车站编号和时间。

    输出

    仅一行,包含一个整数T,为最少的总时间

    样例输入

    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
    #include<cstdio>
    #include<algorithm>
    #include<cstring>
    #include<new>
    #include<queue>
    #include<iostream>
    using namespace std;
    int s[7];
    int dis[7][50001];
    int n;
    int m,u,v,w,ans=2e9;
    bool pg[50001];
    int flag[7];
    int ll[7];
    int ne[300001],fir[50001],val[300001],to[300001],tot;
    void add(int u,int v,int w)
    {
        to[++tot]=v;val[tot]=w;ne[tot]=fir[u];fir[u]=tot;
    }
    queue<int> q;
    int doit()
    {
        int lol=0;
        for(int i=1;i<=6;i++)
        {
            lol+=dis[ll[i]][s[ll[i+1]]];
        }
        ans=min(lol,ans);
    }
    void dfs(int x)
    {
        if(x==6) doit();
        for(int i=2;i<=6;i++)
        {
            if(!flag[i])
            {
                flag[i]=1;
                ll[x+1]=i;
                dfs(x+1);
                flag[i]=0;
                ll[x+1]=0;
            }
        }
    }
    int main()
    {
        cin>>n>>m;
        s[1]=1;
        ll[1]=1;
        for(int i=2;i<=6;i++) cin>>s[i];
        for(int i=1;i<=m;i++)
        {
            cin>>u>>v>>w;
            add(u,v,w);
            add(v,u,w);
        }
        for(int i=1;i<=6;i++)
        {
            while(!q.empty())q.pop();
            for(int j=1;j<=n;j++) dis[i][j]=1e8;
            for(int j=1;j<=n;j++) pg[j]=0;
            q.push(s[i]);dis[i][s[i]]=0;pg[s[i]]=1;
            while(!q.empty())
            {
                int xx=q.front();
                q.pop();pg[xx]=0;
                for(int k=fir[xx];k;k=ne[k])
                {
                    int ttt=to[k];
                    if(dis[i][xx]+val[k]<=dis[i][ttt])
                    {
                        dis[i][ttt]=dis[i][xx]+val[k];
                        if(!pg[ttt])
                        {
                            q.push(ttt);
                            pg[ttt]=1;
                        }
                    }
                }
            }
        }
        dfs(1);
        cout<<ans<<endl;
    }
  • 相关阅读:
    基于接口(工厂模式)三层架构的引用和访问流程
    数据库访问类小结
    是毁灭还是重生——从浏览器大战看未来软件发展
    Func,Action的介绍及其用法
    IIS发布程序后,出现“服务器应用程序不可用”的错误
    泛型委托 Action<T>和Func<T,TResult>
    IIS发布程序后,出现“服务器应用程序不可用”的错误
    利用winrar自动备份重要资料
    HDU 2795 Billboard
    HDU 1140 War on Weather
  • 原文地址:https://www.cnblogs.com/Lazy-Cat/p/9838228.html
Copyright © 2011-2022 走看看