您好,欢迎来到华佗小知识。
搜索
您的当前位置:首页P1948 [USACO08JAN]电话线Telephone Lines

P1948 [USACO08JAN]电话线Telephone Lines

来源:华佗小知识

题目链接

  

分析

具体代码

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<vector>
#include<queue>
using namespace std;
const int maxn=1000010;
typedef pair<int,int>node;
struct Edge
{
    int dis,next,to;
} E[maxn/2];
int Dis[1010],Head[1010],num_Edge,vis[1010];
int N,P,K,mid,MAX_DIS;
inline int Read(void)
{
    int w=0,x=0;
    char ch=0;
    while(!isdigit(ch)) w|=ch=='-',ch=getchar();
    while(isdigit(ch)) x=x*10+(ch^48),ch=getchar();
    return w?-x:x;
}
inline void Add_Edge(int u,int v,int d)
{
    E[++num_Edge].dis =d;
    E[num_Edge].to =v;
    E[num_Edge].next =Head[u];
    Head[u]=num_Edge;
}
inline void Set()
{
    memset(vis,0,sizeof(vis));
    for(int i=1; i<=N; ++i)
        Dis[i]=2147483247;
    Dis[1]=0;
}
inline int Dijkstra(void)
{
    Set();
    priority_queue<node,vector<node>,greater<node> >Q;
    Q.push(make_pair(0,1));
    while(!Q.empty() )
    {
        int u=Q.top().second;
        Q.pop() ;
        if(vis[u]) continue;
        for(int i=Head[u]; i; i=E[i].next )
        {
            int v=E[i].to,dis=E[i].dis>mid?1:0;
            if(Dis[v]>Dis[u]+dis)
            {
                Dis[v]=Dis[u]+dis;
                if(!vis[v])
                    Q.push(make_pair(Dis[v],v));
            }

        }
    }
    return Dis[N];
}
int main(void)
{
    N=Read(),P=Read(),K=Read();
    for(int i=1; i<=P; ++i)
    {
        int u=Read(),v=Read(),d=Read();
        MAX_DIS=max(MAX_DIS,d);
        Add_Edge(u,v,d);
        Add_Edge(v,u,d);
    }
    int l=0,r=MAX_DIS;
    while(l<r)
    {
        mid=(l+r)/2;
        if(Dijkstra()>K)    l=mid+1;
        else r=mid;
    }
    if(l==MAX_DIS) printf("-1\n");
    else printf("%d\n",r);
    return 0;
}

 

转载于:https://www.cnblogs.com/Blacktears/p/11523700.html

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- huatuo0.cn 版权所有 湘ICP备2023017654号-2

违法及侵权请联系:TEL:199 18 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务