架設電話線 題解

2022-09-10 15:18:31 字數 1989 閱讀 4658

原題來自:usaco 2008 jan. silver

在郊區有 \(n\) 座通訊基站,\(p\) 條雙向電纜,第 \(i\) 條電纜連線基站 \(a_i\) 和 \(b_i\)。特別地,\(1\) 號基站是通訊公司的總站,\(n\) 號基站位於一座農場中。現在,農場主希望對通訊線路進行公升級,其中公升級第 \(i\) 條電纜需要花費 \(l_i\)。

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

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

第一行三個整數 \(n, p, k\).

接下來 \(p\) 行,每行三個整數 \(a_i, b_i, l_i\).

若不存在從 \(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
看到最大的最小?那一定是二分。看到第 \(k\) 大的最小?顯然這還是二分。

我們可以直接二分答案。然後每次 \(check\) 答案的時候,將所有的大於這個值的邊的權值改為 \(1\),其餘的改為 \(0\)。其實就是標記了一下比當前列舉答案大的。

然後跑最短路,如果最短路跑出來小於 \(k\) 則說明滿足一條路徑上二分的這個答案是第 \(k + 1\) 大的,反之則說明當前列舉的答案不是可行解。繼續二分。

接下來我們看看詳細複雜,囉嗦,累贅的**。

#include #include #include #include using namespace std;

int n, p, k;

struct edge

edge(int v, int cost)

};const int maxn = 2005;

const int inf = 0x3f3f3f3f;

vectorgraph[maxn];

int ma = 0;

bool flag = true;

int dist[maxn];

bool vis[maxn];

vectormp[maxn];

void read(int &x)

while (s >= '0' && s <= '9')

x *= k;

return;

}void add_edge(int u, int v, int cost)

void init(int x) else

}// for(int i = 1; i <= n; i++)

// for(int j = 0; j < mp[i].size(); j++)

// printf("%d %d %d\n", i, mp[i][j].v, mp[i][j].cost);

return;

}int dijkstra(int x)

vis[k] = true;

for (int j = 0; j < mp[k].size(); j++)

}return dist[n];

}bool check(int mid)

if (t > k)

return false;

return true;

}int find()

}return l;

}int main()

printf("%d\n", find());

return 0;

}

架設電話線 二分答案 SPFA

description farmer john打算將 線引到自己的農場,但電信公司並不打算為他提供免費服務。於是,fj必須為此向電信公司支付一定的費用。fj的農場周圍分布著n 1 n 1,000 根按1 n順次編號的廢棄的 線 杆,任意兩根 線桿間都沒有 線相連。一共p 1 p 10,000 對 線...

二分答案 spfa 架設電話線

架設 線 phoneline 題目描述 farmer john打算將 線引到自己的農場,但電信公司並不打算為他提供免費服務。於是,fj必須為此向電信公司支付一定的費用。fj的農場周圍分布著n 1 n 1,000 根按1.n順次編號的廢棄的 線桿,任意兩根 線桿間都沒有 線相連。一共p 1 p 10,...

LOJ 架設電話線 二分 spfa

題面見鏈結。題解 一般來說看到這總 第 k 大的 都往二分想想。這題其實蠻基礎的。二分這第 k 1 大的邊的權值,然後整個圖的邊比它大的權值為 1 比他小的權值為 0 最後跑一遍 spfa 求出整個圖的最短路徑,如果 k 則成立,可繼續縮小範圍,否則則只能增加範圍。如下 1 include2 usi...