zoukankan      html  css  js  c++  java
  • 洛谷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;
    }
    
  • 相关阅读:
    WebForms和MVC之间的抉择
    RPM install Error: Failed dependencies
    存储NAS和SAN
    python基础31[visualstudio2010来编写python程序]
    Linux系统性能检测
    perl的引用和>
    Linux内存高级 [swap/buffer]
    python类库26[web2py的URL映射]
    python类库31[python的libpath]
    VShpere中创建新Linux(ubuntu)的virtual machine
  • 原文地址:https://www.cnblogs.com/ShineEternal/p/10981494.html
Copyright © 2011-2022 走看看