巡邏 論為什麼第二次求直徑要用dp

2022-02-15 22:03:52 字數 2454 閱讀 8261

在乙個地區有 n 個村莊,編號為1,2,…,n。

有 n-1 條道路連線著這些村莊,每條道路剛好連線兩個村莊,從任何乙個村莊,都可以通過這些道路到達其他任乙個村莊。

每條道路的長度均為1個單位。

為保證該地區的安全,巡警車每天都要到所有的道路上巡邏。

警察局設在編號為1的村莊裡,每天巡警車總是從警局出發,最終又回到警局。

為了減少總的巡邏距離,該地區準備在這些村莊之間建立 k 條新的道路,每條新道路可以連線任意兩個村莊。

兩條新道路可以在同乙個村莊會合或結束,甚至新道路可以是乙個環。

因為資金有限,所以 k 只能為1或2。

同時,為了不浪費資金,每天巡警車必須經過新建的道路正好一次。

編寫乙個程式,在給定村莊間道路資訊和需要新建的道路數的情況下,計算出最佳的新建道路的方案,使得總的巡邏距離最小。

第一行包含兩個整數 n 和 k。

接下來 n-1 行每行兩個整數 a 和 b,表示村莊 a 和 b 之間有一條道路。

輸出乙個整數,表示新建了 k 條道路後能達到的最小巡邏距離。

3≤n≤100000,

1≤k≤2,

1≤a,b≤n

8 1 

1 2

3 1

3 4

5 3

7 5

8 5

5 6

11
先說一下主要思路吧

k = 1/ 2, 說白了就是造兩個環

第乙個很簡單, 就是連線直徑

第二條也是連線直徑(第二大), 那問題來了, 如何消除已經連過的直徑?

將所連過的直徑權值又1改-1, 即可

相當於你在算這條邊未直徑時, 貢獻值為-1

那為什麼不應該是貢獻值為 0 呢?

其實是, 當你第一次連線直徑時, 原本要原路返回, 這條邊會走兩次, 你連線之後直走一次

第二次連線時, 這條邊會由於你的連線非但沒少走, 還會多走一邊故, 貢獻從 1 變為 -1(新建的邊必須走一次)

基本思路如此

問題來了, 第二次改變完邊的權值時, 你不能用 dfs 或 bfs 去求直徑, 為什麼呢?

看一組資料(別人造的)

10 2

6 10

5 36 4

7 38 3

6 11 9

2 16 3

按照思路走一遍, 你會發現

第二次求直徑時, 第一次搜尋, 隨著你選取的點不同, 找出的直徑中的某個端點也不同

你拿著這個端點再去求, 另乙個端點, 你求的直徑能對嗎?

所以第二次求直徑要dp

那為什麼第一次不直接也用dp求呢?

搜尋可以回溯啊!改權值好改

#include #define all(n) (n).begin(), (n).end()

#define se second

#define fi first

#define pb push_back

#define mp make_pair

#define sqr(n) (n)*(n)

#define rep(i,a,b) for(int i=a;i<=(b);++i)

#define per(i,a,b) for(int i=a;i>=(b);--i)

using namespace std;

typedef long long ll;

typedef pairpii;

typedef vectorvi;

typedef double db;

const int n = 100005;

int n, m, _, k;

bool v[n];

int h[n], ne[n << 1], co[n << 1], to[n << 1], tot;

int d[n], f[n], b[n];

void add(int u, int v, int c)

void dfs(int u)

}void work(int& p, int& q)

void dpfind(int u, int& ans)

d[u] = max(d[u], 0);

}int main()

int p, q, ans = (n - 1) << 1;

work(p, q);

ans -= d[0] - 1;

if (k == 2)

memset(d, 0xbf, sizeof d);

memset(v, 0, sizeof v);

int res = 0;

dpfind(p, res);

ans -= res - 1;

}cout << ans;

return 0;

}

第一次借款成功,為什麼第二次被拒?

最近有朋友跟小美抱怨,他還完了第一次的借款,還想繼續再借點,本想著一定妥妥的,結果第二次借款竟然被拒了!確實,一般情況下,大多數的借款產品,在按時還完款之後,二次借款比較容易通過,而且借款平台可能還會根據良好的還款記錄,提高一定的借款額度 運氣好的小夥伴,還可能享受到放款利率降低的福利。不過二次借款...

XYNUOJ暑期集訓第二次測試 D 走格仔

d 走格仔 有編號1 n的n個格仔,機械人從1號格仔順序向後走,一直走到n號格仔,並需要從n號格仔走出去。機械人有乙個初始能量,每個格仔對應乙個整數aii,表示這個格仔的能量值。如果aii 0,機械人走到這個格仔能夠獲取aii個能量,如果aii 0,走到這個格仔需要消耗相應的能量,如果機械人的能量 ...

P2 2017級演算法第二次上機 D 天秤的煩惱

天秤是厄普西隆陣營的實際統治者 尤里大人的掌上明珠。從為數不多的情報上來看,天秤堪稱厄普西隆陣營中擁有最強心靈力量的人。然而那些犧牲了多名情報人員換來的情報似乎暗示,出於某些自身的原因,她並不能運用自己的心靈力量去穩定地控制目標。事實上,天秤的脊柱上被永久固定了乙個名為 cas的系統,以防止天秤的心...