通信线路(分层图)

Posted iss-ue

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了通信线路(分层图)相关的知识,希望对你有一定的参考价值。

题意: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

 

以上是关于通信线路(分层图)的主要内容,如果未能解决你的问题,请参考以下文章

小雨坐地铁分层图最短路

分层模型介绍

网络分层和Http协议原理

10 - JavaSE之网络编程

题解——Acwing.340 通信线路

TCP/IP 协议图--计算机网络体系结构分层