[USACO08JAN]电话线Telephone Lines
2016-12-23 18:06
387 查看
多年以后,笨笨长大了,成为了电话线布置师。由于地震使得某市的电话线全部损坏,笨笨是负责接到震中市的负责人。该市周围分布着N(1<=N<=1000)根据1……n顺序编号的废弃的电话线杆,任意两根线杆之间没有电话线连接,一共有p(1<=p<=10000)对电话杆可以拉电话线。其他的由于地震使得无法连接。
第i对电线杆的两个端点分别是ai,bi,它们的距离为li(1<=li<=1000000)。数据中每对(ai,bi)只出现一次。编号为1的电话杆已经接入了全国的电话网络,整个市的电话线全都连到了编号N的电话线杆上。也就是说,笨笨的任务仅仅是找一条将1号和N号电线杆连起来的路径,其余的电话杆并不一定要连入电话网络。
电信公司决定支援灾区免费为此市连接k对由笨笨指定的电话线杆,对于此外的那些电话线,需要为它们付费,总费用决定于其中最长的电话线的长度(每根电话线仅连接一对电话线杆)。如果需要连接的电话线杆不超过k对,那么支出为0.
请你计算一下,将电话线引导震中市最少需要在电话线上花多少钱? ——by洛谷(洛谷少有的良心翻译)
https://www.luogu.org/problem/show?pid=1948
二分答案+有条件的最短路;
二分可能的答案,即对读入的边长sort,然后二分
对于每个答案跑SPFA(因为手头有SPFA板子)
SPFA的松弛为spf[x[i].to]=spf[que[h]]+(x[i].dis>ct?1:0)(ct为二分的答案,意味着如果本边长度大于答案,则让这条边占用公司的名额)
若spf
>k,则把n连入时不可能以当前答案为答案(因为以当前答案为答案,占用名额一定大于k)
代码如下:
祝AC哟;
第i对电线杆的两个端点分别是ai,bi,它们的距离为li(1<=li<=1000000)。数据中每对(ai,bi)只出现一次。编号为1的电话杆已经接入了全国的电话网络,整个市的电话线全都连到了编号N的电话线杆上。也就是说,笨笨的任务仅仅是找一条将1号和N号电线杆连起来的路径,其余的电话杆并不一定要连入电话网络。
电信公司决定支援灾区免费为此市连接k对由笨笨指定的电话线杆,对于此外的那些电话线,需要为它们付费,总费用决定于其中最长的电话线的长度(每根电话线仅连接一对电话线杆)。如果需要连接的电话线杆不超过k对,那么支出为0.
请你计算一下,将电话线引导震中市最少需要在电话线上花多少钱? ——by洛谷(洛谷少有的良心翻译)
https://www.luogu.org/problem/show?pid=1948
二分答案+有条件的最短路;
二分可能的答案,即对读入的边长sort,然后二分
对于每个答案跑SPFA(因为手头有SPFA板子)
SPFA的松弛为spf[x[i].to]=spf[que[h]]+(x[i].dis>ct?1:0)(ct为二分的答案,意味着如果本边长度大于答案,则让这条边占用公司的名额)
若spf
>k,则把n连入时不可能以当前答案为答案(因为以当前答案为答案,占用名额一定大于k)
代码如下:
#include<cstdio> #include<cstring> #include<algorithm> using namespace std; struct ss { int to,next,dis; }x[20001]; int first[1001]; int d[10001]; int que[10000],vis[1001],spf[1001]; int n,pd,k,num,p; void build(int f,int t,int di) { x[++num].next=first[f]; x[num].to=t; x[num].dis=di; first[f]=num; } void spfa(int ,int ); int main() { int i,j,l,r,mid; scanf("%d%d%d",&n,&p,&k); for(i=1;i<=p;i++) { scanf("%d%d%d",&j,&l,&d[i]); build(j,l,d[i]); build(l,j,d[i]); } sort(d+1,d+p+1); l=0;r=p;mid=(l+r)/2; while(l<r) { memset(spf,(0x3f3f3f),sizeof(spf)); pd=0; spfa(1,d[mid]); if(pd==1) { r=mid; mid=(l+r)/2; } else { l=mid+1; mid=(l+r)/2; } } if(r==p&&pd==0)d[r]=-1; printf("%d",d[r]); return 0; } void spfa(int s,int ct) { int h=0,t=1,i; spf[s]=0; que[t]=s;vis[s]=1; while(h<t) { h++; vis[que[h]]=0; i=first[que[h]]; while(i!=0) { if(spf[x[i].to]>spf[que[h]]+(x[i].dis>ct?1:0)) { spf[x[i].to]=spf[que[h]]+(x[i].dis>ct?1:0); if(vis[x[i].to]==0) { t++; que[t]=x[i].to; vis[que[t]]=1; } } i=x[i].next; } } if(spf <=k) pd=1; return ; }
祝AC哟;
相关文章推荐
- 洛谷 P1948 [USACO08JAN]电话线Telephone Lines【NOIP模拟笨笨的电话线】
- [USACO08JAN]电话线Telephone Lines 洛谷P1948
- USACO 08 JAN 电话线Telephone Lines(二分法在图论题中的应用)
- 洛谷P1948 [USACO08JAN]电话线Telephone Lines
- 洛谷 1948 [USACO08JAN]电话线Telephone Lines
- [USACO08JAN]电话线Telephone Lines
- 洛谷P1948 [USACO08JAN]电话线Telephone Lines
- 二分查找+spfa(洛谷1948 [USACO08JAN]电话线Telephone Lines) 4000
- luogu P1948 [USACO08JAN]电话线Telephone Lines
- 洛谷 P1948 [USACO08JAN]电话线Telephone Lines
- POJ3662,洛谷1948 [USACO08JAN]电话线Telephone Lines
- 【SPFA+二分答案】BZOJ1614- [Usaco2007 Jan]Telephone Lines架设电话线
- [BZOJ1614][Usaco2007 Jan]Telephone Lines架设电话线
- 1614: [Usaco2007 Jan]Telephone Lines架设电话线
- SPFA+二分-BZOJ-1614-[Usaco2007 Jan]Telephone Lines架设电话线
- bzoj 1614: [Usaco2007 Jan]Telephone Lines架设电话线(二分+SPFA)
- bzoj 1614: [Usaco2007 Jan]Telephone Lines架设电话线 二分+spfa
- bzoj 1614: [Usaco2007 Jan]Telephone Lines架设电话线 二分+最短路
- BZOJ——1614: [Usaco2007 Jan]Telephone Lines架设电话线
- 【bzoj1614】[Usaco2007 Jan]Telephone Lines架设电话线 二分+SPFA