• 340. 通信线路(分层图最短路)


    在郊区有 N 座通信基站,P 条双向电缆,第 i 条电缆连接基站AiAi和BiBi。

    特别地,1 号基站是通信公司的总站,N 号基站位于一座农场中。

    现在,农场主希望对通信线路进行升级,其中升级第 i 条电缆需要花费LiLi。

    电话公司正在举行优惠活动。

    农产主可以指定一条从 1 号基站到 N 号基站的路径,并指定路径上不超过 K 条电缆,由电话公司免费提供升级服务。

    农场主只需要支付在该路径上剩余的电缆中,升级价格最贵的那条电缆的花费即可。

    求至少用多少钱可以完成升级。

    输入格式

    第1行:三个整数N,P,K。

    第2..P+1行:第 i+1 行包含三个整数Ai,Bi,LiAi,Bi,Li。

    输出格式

    包含一个整数表示最少花费。

    若1号基站与N号基站之间不存在路径,则输出”-1”。

    数据范围

    0K<N10000≤K<N≤1000,
    1P100001≤P≤10000,
    1Li10000001≤Li≤1000000

    输入样例:

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

    输出样例:

    4
    代码:
    #include<cstdio>
    #include<iostream>
    #include<cstring>
    #include<algorithm>
    #include<queue>
    #include<stack>
    #include<set>
    #include<vector>
    #include<map>
    #include<cmath>
    
    const int N=1000000+10,M=1000000+10;
    typedef long long ll;
    using namespace std;
    
    
    int n,p,k;
    int tot=0;
    priority_queue< pair<int ,int> > q;
    struct edge
    {
        int u,v;
        int  w;
        int nxt;
    }Edge[M];
    int head[N],dis[N];
    bool v[N];
    
    void add(int u,int v,int w)
    {
        Edge[++tot].u=u;
        Edge[tot].v=v;
        Edge[tot].w=w;
        Edge[tot].nxt=head[u];
        head[u]=tot;
    }
    void dijkstra()
    {
        memset(dis,0x3f3f3f3f,sizeof(dis));
        dis[1]=0;
        q.push(make_pair(0,1));
        while(q.size())
        {
            int x=q.top().second;
            q.pop();
            if(v[x]) continue;
            v[x]=true;
            for(int i=head[x];i;i=Edge[i].nxt)
            {
                int y=Edge[i].v,z=max(Edge[i].w,dis[x]);
                if(dis[y]>z)
                {
                    dis[y]=z;
                    q.push(make_pair(-dis[y],y));
                }
            }
        }
    }
    
    int main()
    {
        scanf("%d%d%d",&n,&p,&k);
        for(int i=1,x,y,z;i<=p;i++)
        {
            scanf("%d%d%d",&x,&y,&z);
            add(x,y,z);
            add(y,x,z);
            for(int j=1,z1=0;j<=k;j++)
            {
                add(x+(j-1)*n,y+j*n,z1);
                add(y+(j-1)*n,x+j*n,z1);
                add(x+j*n,y+j*n,z);
                add(y+j*n,x+j*n,z);
            }
        }
        for(int i=1,z=0;i<=k;i++)
            add(i*n,(i+1)*n,z);
        dijkstra();
        if(dis[k+1]*n>=0x3f3f3f3f)
        {
            puts("-1");
        }
        else
        printf("%d",dis[(k+1)*n]);
        return 0;
    }
  • 相关阅读:
    sublime3 常用快捷键
    sublime3 常用插件
    前端整理——css部分
    JS数组与对象的遍历方法大全
    Javascript 异步加载详解
    五大主流浏览器内核的源起以及国内各大浏览器内核总结
    JavaScript的分支结构(switch,if..else)
    js---作用域,作用域链,立即执行函数,闭包
    js预编译
    利用js实现轮播图
  • 原文地址:https://www.cnblogs.com/Staceyacm/p/11319928.html
Copyright © 2020-2023  润新知