通信线路(分层图)

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

 

posted @ 2020-03-16 13:57  倾叶子佮  阅读(504)  评论(0编辑  收藏  举报