要求給出下面**的答案然後構造輸入。
給乙個圖, n 個點 m 條邊 q 次詢問,輸出所有點對之間最大權值最小的路徑。
把每乙個詢問的輸出看成一條邊,建一棵最小生成樹。
給輸出,要求構造輸入使得用所給**執行後得到的輸出和給出的輸出相同。
所給**:n 次 dijkstra 求兩點間最短路
考慮一下貪心。
首先還是把每一條最短路的詢問結果看成一條邊,然後我們把這些邊排序。
對於每一條邊,如果這兩個點現在的距離大於這條邊的權值,我們就把這條邊加進去,更新所有點對
的距離。
正確性顯然。
現在證明這樣做邊數最短:
假設這樣得到的構造方案為 a ,假設還有一種構造方案是 b ,並且邊數更少。
那麼在 a 中肯定存在一條邊,在 b 中不存在。
於是在 b 中,這一條邊的兩個端點之間的距離,肯定大於 a 中這條邊的邊權。
否則如果相等的話,在 a 中就不會選擇這一條邊。
因此, b 這個方案肯定是非法的,也就是說, a 是邊數最少的構造方案。
#include using namespace std;
namespace one e[m];
int p[n], n, tot, m;
bool cmp(const e &a, const e &b)
void work()
for(int x=1; x<=10000; ++x)
}} }
}namespace three e[1000005];
bool cmp(const e &a, const e &b)
int j, rt, na;
for(j=0, na=a[csz].size(); j=1; --i)
a[r]=right;
vis[right]=1;
--right;
}} for(int i=1; i<=n; ++i)
while(vis[right])
a[i]=right;
--right;
} for(int i=1; i<=n; ++i)
for(int i=0; iint main()
弱省互測 0 t1
給乙個 n times m 的01網格,1不能走,從起點 1,1 走到 n,m 每次只能向下或向右走一格,問兩條不相交的路徑的方案數。n,m 1000 先考慮一條,再考慮去掉相交的情況。令 d a,b,c,d 表示從 a,b 走到 c,d 一條路徑的方案數,則可以簡單得到答案 ans d 2,1,n...
弱省互測 0 t2
給定兩個字串 a 和 b,求下面四個問題的答案 1.在 a 的子串中,不是 b 的子串的字串的數量。2.在 a 的子串中,不是 b 的子串行的字串的數量。3.在 a 的子串行中,不是 b 的子串的字串的數量。4.在 a 的子串行中,不是 b 的子串行的字串的數量。其中子串是指本質不同的子串,不同的位...
弱省互測 2 t3
給出 n 個01位元組和 m 個01位元組,要求用後者去匹配前者,兩個串能匹配當且僅當除了每個位元組末位不同,其他位都要相同。問匹配後者至少有多少個末位不同。1 le m le n le 2.5 times 10 5 首先我們可以用kmp計算出能匹配的位置,然後單獨考慮末位不同的情況。我們將末尾的位...