在乙個地區有 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的系統,以防止天秤的心...