zoukankan      html  css  js  c++  java
  • 通信线路(分层图)

    题意:https://www.acwing.com/problem/content/342/

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

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

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

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

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

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

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


    分层图。

    更新的时候

    node e=d[i];
                int t=max(dis[ans.num][ans.ci],e.w);
                if(t<dis[e.to][ans.ci])
                {
                    dis[e.to][ans.ci]=t;
                    p tt;
                    tt.num=e.to,tt.x=dis[e.to][ans.ci],tt.ci=ans.ci;
                    q.push(tt);
                }
                if(ans.ci>=k)    continue;
                if(dis[e.to][ans.ci+1]>dis[ans.num][ans.ci])
                {
                    dis[e.to][ans.ci+1]=dis[ans.num][ans.ci];
                    p tt;
                    tt.num=e.to,tt.x=dis[e.to][ans.ci+1],tt.ci=ans.ci+1;
                    q.push(tt);
                }

    其余照搬。

    #include <bits/stdc++.h>
    using namespace std;
    const int maxn=20009;
    int n,m,k;
    struct p{
        int x,ci,num;
        bool operator < (const p&tmp)    const{
            return x>tmp.x;
        }
    }init;
    struct node{
        int to,w,nxt;
    }d[maxn];int head[maxn],dis[1009][1009],cnt=1;
    void add(int u,int v,int w){
        d[cnt].nxt=head[u],d[cnt].to=v,
        d[cnt].w=w,head[u]=cnt++;
    }
    int vis[1009][1009];
    void dij()
    {
        memset(dis,20,sizeof(dis));
        priority_queue<p>q;
        init.ci=init.x=0,init.num=1;q.push(init);
        dis[1][0]=0;
        while(!q.empty())
        {
            p ans=q.top();q.pop();
            if(vis[ans.num][ans.ci])    continue;
            vis[ans.num][ans.ci]=1;
            for(int i=head[ans.num];i;i=d[i].nxt)
            {
                node e=d[i];
                int t=max(dis[ans.num][ans.ci],e.w);
                if(t<dis[e.to][ans.ci])
                {
                    dis[e.to][ans.ci]=t;
                    p tt;
                    tt.num=e.to,tt.x=dis[e.to][ans.ci],tt.ci=ans.ci;
                    q.push(tt);
                }
                if(ans.ci>=k)    continue;
                if(dis[e.to][ans.ci+1]>dis[ans.num][ans.ci])
                {
                    dis[e.to][ans.ci+1]=dis[ans.num][ans.ci];
                    p tt;
                    tt.num=e.to,tt.x=dis[e.to][ans.ci+1],tt.ci=ans.ci+1;
                    q.push(tt);
                }
            }
        }
    }
    int main()
    {
        cin>>n>>m>>k;
        for(int i=1;i<=m;i++)
        {
            int l,r,w;
            cin>>l>>r>>w;
            add(l,r,w);add(r,l,w);
        }
        dij();
        int ans=99999999;
        for(int i=0;i<=k;i++)
            ans=min(dis[n][i],ans);
        if(ans==99999999)    cout<<-1;
        else    cout<<ans;
    }
    View Code
  • 相关阅读:
    ajax异步服务器获取时间
    JavaScript基本知识
    JavaScript使用button提交表单
    spring与hibernate整合
    Spring的事务属性
    注解方式实现Spring声明式事务管理
    svn的安装使用
    sbn
    恢复oracle中误删除drop掉的表
    ORA-20000: ORU-10027: buffer overflow, limit of 2000 bytes的解决办法
  • 原文地址:https://www.cnblogs.com/iss-ue/p/12503449.html
Copyright © 2011-2022 走看看