1614: [Usaco2007 Jan]Telephone Lines架设电话线

Posted You only live once

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了1614: [Usaco2007 Jan]Telephone Lines架设电话线相关的知识,希望对你有一定的参考价值。

传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=1614

做法:二分答案

首先附上让我找了两天错的代码

#include<queue>
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
struct data{int to,next,c;}e[20001];
int n,p,k,cnt,head[1001],dis[1001],ans=-1;
bool vis[1001];
void insert(int u,int v,int w)
{cnt++;e[cnt].to=v;e[cnt].c=w;e[cnt].next=head[u];head[u]=cnt;}
bool spfa(int x)
{
    int sum,u,v;
    queue<int>q;
    q.push(1);
    memset(dis,127/3,sizeof(dis));
    dis[1]=0;
    while(!q.empty())
    {
        u=q.front();q.pop();vis[u]=0;
        for(int i=head[u];i;i=e[i].next)
        {
            v=e[i].c;
             if(e[i].c>x) sum=dis[u]+1;
             else sum=dis[u];
             if(dis[v]>sum)
             {
                dis[v]=sum;
                if(!vis[v])
                {
                    vis[v]=1;
                    q.push(v);
                }
             }
        }
    }
    if(dis[n]<=x)
    return 1;
    return 0;
}
int main()
{
    scanf("%d%d%d",&n,&p,&k);
    for(int i=1;i<=p;i++)
    {
            int u,v,w;
            scanf("%d%d%d",&u,&v,&w);
            insert(u,v,w);insert(v,u,w);
    }
    int l=0,r=1000000;
    while(l<=r)
    {
               int mid=(l+r)>>1;
               if(spfa(mid)){ans=mid;r=mid-1;}
               else l=mid+1;
               } 
    printf("%d",ans);
    return 0;
}
WA

最后找到的是dis[n]<=k写成了dis[n]<=x

#include<queue>
#include<iostream>
#include<cstdio>
#include<cstring>
#define inf 0x7fffffff
using namespace std;
struct data{int to,next,c;}e[20001];
int n,p,k,cnt,head[1001],dis[1001],ans=-1;
bool vis[1001];
void insert(int u,int v,int w)
{cnt++;e[cnt].to=v;e[cnt].c=w;e[cnt].next=head[u];head[u]=cnt;}
bool spfa(int x)
{
    int sum,u,v;
    queue<int>q;
    q.push(1);
    memset(dis,127/3,sizeof(dis));
    dis[1]=0;
    while(!q.empty())
    {
        u=q.front();q.pop();vis[u]=0;
        for(int i=head[u];i;i=e[i].next)
        {
            v=e[i].to;
             if(e[i].c>x) sum=dis[u]+1;
             else sum=dis[u];
             if(dis[v]>sum)
             {
                 dis[v]=sum;
                 if(!vis[v])
                 {
                     vis[v]=1;
                     q.push(v);
                 }
             }
        }
    }
    if(dis[n]<=k)
    return 1;
    return 0;
}
int main()
{
    scanf("%d%d%d",&n,&p,&k);
    for(int i=1;i<=p;i++)
    {
            int u,v,w;
            scanf("%d%d%d",&u,&v,&w);
            insert(u,v,w);insert(v,u,w);
    }
    int l=0,r=1000000;
    while(l<=r)
    {
               int mid=(l+r)>>1;
               if(spfa(mid)){ans=mid;r=mid-1;}
               else l=mid+1;
               } 
    printf("%d",ans);
    return 0;
}
AC

So sad,but I will be fine

 以上By optimistic_LQ_double

以上是关于1614: [Usaco2007 Jan]Telephone Lines架设电话线的主要内容,如果未能解决你的问题,请参考以下文章

BZOJ 1614: [Usaco2007 Jan]Telephone Lines

[bzoj1614][Usaco2007Jan]Telephone Lines 架设电话线_二分答案_最短路

BZOJ——1614: [Usaco2007 Jan]Telephone Lines架设电话线

[bzoj1614]: [Usaco2007 Jan]Telephone Lines架设电话线

bzoj1614[Usaco2007 Jan]Telephone Lines架设电话线

bzoj1614: [Usaco2007 Jan]Telephone Lines架设电话线(二分答案 + spfa)