日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 人文社科 > 生活经验 >内容正文

生活经验

LOJ10074架设电话线

發布時間:2023/11/27 生活经验 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 LOJ10074架设电话线 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

USACO 2008 Jan. Silver

在郊區有?N?座通信基站,P?條雙向電纜,第?i?條電纜連接基站?Ai??和?Bi?。特別地,1?號基站是通信公司的總站,N?號基站位于一座農場中。現在,農場主希望對通信線路進行升級,其中升級第i?條電纜需要花費Li?

電話公司正在舉行優惠活動。農場主可以指定一條從?1?號基站到?N?號基站的路徑,并指定路徑上不超過?K?條電纜,由電話公司免費提供升級服務。農場主只需要支付在該路徑上剩余的電纜中,升級價格最貴的那條電纜的花費即可。求至少用多少錢能完成升級。

一句話題意?\ \???在加權無向圖上求出一條從?1?號結點到?N?號結點的路徑,使路徑上第K+1?大的邊權盡量小。

輸入格式

第一行三個整數?N,P,K.

接下來?P?行,每行三個整數?Ai?,Bi?,Li?.

輸出格式

若不存在從?1?到?N?的路徑,輸出?-1。否則輸出所需最小費用。

樣例

樣例輸入

5 7 1
1 2 5
3 1 4
2 4 8
3 2 3
5 2 9
3 4 7
4 5 6

樣例輸出

4

數據范圍與提示

0K<N1000,1P2000

——————————————————————————————

二分付費邊的長度。

那么所有小于等于該長度的邊設為0,大于它的邊的長度設為1,那么如果從點1到點n的最短距離小于等于k,說明可以可以建起,否則不可以。

注意判斷-1。

——————————————————————————————

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 const int maxn=1010;
 4 const int maxm=2010;
 5 int n,m,k;
 6 struct edge
 7 {
 8     int u,v,w,ww,nxt;
 9 }e[maxm<<1];
10 int head[maxn],js;
11 void addage(int u,int v,int w)
12 {
13     e[++js].u=u;e[js].v=v;e[js].w=w;
14     e[js].nxt=head[u];head[u]=js;
15 }
16 int l,r,ans;
17 struct node
18 {
19     int dis,p;
20     bool operator < (node b)const 
21     {
22         return dis>b.dis;
23     }
24 };
25 
26 bool vis[maxn];
27 int dis[maxn];
28 bool pd(int x)
29 {
30     for(int i=1;i<=m+m;++i)e[i].ww=e[i].w<=x?0:1;
31     memset(dis,0x3f,sizeof dis);
32     memset(vis,0,sizeof vis);
33     priority_queue< node > q;
34     dis[1]=0;
35     q.push((node){0,1});
36     while(!q.empty())
37     {
38         node t=q.top();
39         q.pop();
40         int d=t.dis,p=t.p;
41         if(vis[p])continue;
42         vis[p]=1;
43         for(int i=head[p];i;i=e[i].nxt)
44         {
45             int v=e[i].v;
46             if(dis[v]>dis[p]+e[i].ww)
47             {
48                 dis[v]=dis[p]+e[i].ww;
49                 q.push((node){dis[v],v});
50             }
51         }
52     }
53     if(dis[n]==0x3f3f3f3f)
54     {
55         puts("-1");
56         exit(0);
57     }
58     return dis[n]<=k;
59 }    
60 int main()
61 {
62     scanf("%d%d%d",&n,&m,&k);
63     for(int u,v,w,i=0;i<m;++i)
64     {
65         scanf("%d%d%d",&u,&v,&w);
66         addage(u,v,w);addage(v,u,w);
67         r=max(r,w);
68     }
69     while(l<=r)
70     {
71         int mid=(l+r)>>1;
72         if(pd(mid))ans=mid,r=mid-1;
73         else l=mid+1;
74     }
75     cout<<ans;
76     return 0;
77 }
View Code

?

轉載于:https://www.cnblogs.com/gryzy/p/10533795.html

總結

以上是生活随笔為你收集整理的LOJ10074架设电话线的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。