• 洛谷P1948 [USACO08JAN]电话线Telephone Lines


    链接:

    https://www.luogu.org/problemnew/show/P1948

    bfs+剪枝即可

    代码:

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<string>
    #include<algorithm>
    using namespace std; 
    struct edge
    {
        int to,dis,next;
    };
    struct node
    {
        int now,nk,nd;
    };
    node q[1000005];
    edge e[30005];
    int nex[1005],f[1005][1005];//nex为出点的记录,f[i][j]表示到达i点,使用j条免费电缆的花费最小值 
    int p,head,tail;
    int n,m,k;
    void add(int a,int b,int c)
    {
        p++;
    	e[p].next=nex[a];
        e[p].to=b;
        e[p].dis=c;
        nex[a]=p;
        return ;
    }
    void jl(int now,int k,int dis)
    {
         q[tail].now=now;
         q[tail].nk=k;
         q[tail].nd=dis;
         tail++;
        if(tail==1000005)tail=0;
        return;
    }
    void bfs()
    {
        while(head!=tail)
        {
            int now,nk,nd;
            now=q[head].now;
    		nk=q[head].nk;
    		nd=q[head].nd;
            head++;
            if(head==1000005)
    		head=0;
            for(int i=nex[now];i;i=e[i].next)
            {
                int to=e[i].to;
                if(max(nd,e[i].dis)<f[to][nk])//比当前的最小值花费还小 
                {
                    f[to][nk]=max(nd,e[i].dis);
                    jl(to,nk,max(nd,e[i].dis));//记录,入队 
                }
                if(nd<f[to][nk+1]&&nk<k)//如果不行,就再免费一条线 
                {
                    f[to][nk+1]=nd;
                    jl(to,nk+1,nd);
                }
            }
        }
    }
    int main()
    {
    	scanf("%d%d%d",&n,&m,&k);
        for(int i=1;i<=m;i++)
        {
            int x,y,z;
            scanf("%d%d%d",&x,&y,&z);
            add(x,y,z);
            add(y,x,z);//双向边 
        }
        jl(1,0,0);//初始队列 
        memset(f,0x3f,sizeof(f));//求最小值清最大 
        for(int i=0;i<=k;i++)f[1][i]=0;//初始在1,使用i条免费线因为小于k,所以都可以免费 
        bfs();
        int ans=2147483647;
        for(int i=0;i<=k;i++)
        ans=min(ans,f[n][i]);//走到n,从使用所有的免费电缆中找。 
        if(ans==0x3f3f3f3f)
        {
        	printf("-1
    ");
        }
        else
        {
        	printf("%d
    ",ans);
        }
        return 0;
    }
    
  • 相关阅读:
    用友U8 | 【出纳管理】出纳日记账生成的凭证如何删除?
    转载--如何为chart上的点添加标注
    转载--跨域请求CORS和jsonp
    转载--闭包的使用场景
    转载--闭包的优缺点
    转载--对称加密与非对称加密
    转载--XSS漏洞原理和利用
    转载--强缓存与协商缓存
    转载--CSS常见布局
    转载--透过浏览器看HTTP缓存
  • 原文地址:https://www.cnblogs.com/ShineEternal/p/10981494.html
Copyright © 2020-2023  润新知