Prufer序列 學習筆記

文章目錄

P r u f e r Prufer Prufer 序列

P r u f e r Prufer Prufer 序列可以將一棵 n n n 個點的有編號無根樹 轉化成一個長度為 n ? 2 n - 2 n?2,值域在 [ 1 , n ] [1, n] [1,n] 的序列。也可以將 任意一個 長度為 n ? 2 n - 2 n?2,值域在 [ 1 , n ] [1, n] [1,n] 的序列轉化成一棵 有編號無根樹。可以理解成有標號完全圖的生成樹與數列之間的雙射,常用于對樹計數的問題。

對樹建立 P r u f e r Prufer Prufer 序列

建立過程:
每次找到編號最小的葉子,往序列末尾加入它所連接的節點編號,然后刪掉這個葉子。重復 n ? 2 n - 2 n?2 次后只剩下兩個節點結束。

實現方式:
考慮維護指針 p p p 指向當前最小的葉子編號,每次刪掉 p p p 后判斷 p p p 相連的點是否變成了葉子并且編號小于 p p p,如果滿足這兩個條件那么接著刪掉這個點。重復這個過程直到當前葉子相連的點不滿足上述條件,然后令 p p p 不斷自增直到找到下一個葉子。

正確性說明:

  • 每次刪掉一個葉子后最多只會增加一個葉子,并且如果增加了葉子那么一定是當前葉子所連的點。
  • 設當前葉子為 p p p,刪掉 p p p 后新增葉子 q q q
  • q < p q < p q<p,那么 q q q 一定比其它葉子更小,刪 q q q 是正確的。
  • q > p q > p q>p,那么后面 p p p 自增時一定能枚舉到,因此不用管。

這樣指針只會移動 O ( n ) O(n) O(n) 次,每個點只會被刪除一次,復雜度 O ( n ) O(n) O(n)

代碼:

inline void TP() { // 樹 -> prufer序列for(int i = 1; i < n; i ++ ) deg[fa[i]] ++;int p = 1;for(int i = 1; i <= n - 2; ) {int j = i;while(deg[p]) p ++; pf[j ++] = fa[p]; deg[fa[p]] --;int tp = p;while(j <= n - 2 && !deg[fa[p]] && fa[p] < tp) p = fa[p], pf[j ++] = fa[p], deg[fa[p]] --;i = j; p = ++ tp;}
}

P r u f e r Prufer Prufer 序列的性質:

  • 構造完 P r u f e r Prufer Prufer 序列后原樹會剩下兩個節點,其中一定有一個為 n n n
  • 原樹中的每個點一定在 P r u f e r Prufer Prufer 序列中出現 d e g ? 1 deg - 1 deg?1 次,沒有出現過的就是葉子節點。

從上述建立過程可以看出來:
任意一棵 n n n 個點有編號無根樹都可以建立出唯一的 P r u f e r Prufer Prufer 序列,并且本質不同的樹對應的 P r u f e r Prufer Prufer 序列一定不同
這就完成了 從樹到 P r u f e r Prufer Prufer 序列 的單射。

P r u f e r Prufer Prufer 序列重建樹

建立過程:
對于給定的長為 n ? 2 n - 2 n?2,值域在 [ 1 , n ] [1, n] [1,n] p r u f e r prufer prufer 序列,我們可以統計每個點的出現次數來求出每個點的度數。考慮每次找到編號最小的葉子來確定與它相連的點,顯然這個相連點應該是當前 P r u f e r Prufer Prufer 序列的第一個數。然后把這個葉子刪掉,令相連點的度數減一,然后把 P r u f e r Prufer Prufer 序列的第一個數刪掉,重復這個過程 n ? 2 n - 2 n?2 次。剩下兩個葉子,把它們之間連一條邊即可。

實現方式:
注意到最后剩下的兩個葉子也一定有一個是 n n n,我們將 P r u f e r Prufer Prufer 序列的末尾補上一個 n n n,然后重復上述過程 n ? 1 n - 1 n?1 次就可以連出 n ? 1 n - 1 n?1 條邊。

與建立 P r u f e r Prufer Prufer 序列的過程類似,考慮維護指針 p p p 表示當前編號最小的葉子,然后每次刪掉葉子后判斷新增葉子 q q q 是否比 p p p 小,如果是的話就接著去連 q q q 的出邊,否則就不斷自增 p p p 直到找到下一個葉子。可以看作對于當前葉子 p p p P r u f e r Prufer Prufer 序列的開頭就是以 n n n 為根下 p p p 的父親節點

也不難看出 → \to 序列序列 → \to 的過程是互逆的。一個 P r u f e r Prufer Prufer 序列重建的樹對應的 P r u f e r Prufer Prufer 序列也一定是這個 P r u f e r Prufer Prufer 序列。

復雜度 O ( n ) O(n) O(n)

代碼:

inline void PT() { // prufer序列 -> 樹pf[n - 1] = n;for(int i = 1; i <= n - 2; i ++ ) deg[pf[i]] ++;int p = 1;for(int i = 1; i <= n - 1;) {int j = i;while(deg[p]) p ++; fa[p] = pf[j ++], deg[fa[p]] --;int tp = p;while(j <= n - 1 && !deg[fa[p]] && fa[p] < tp) p = fa[p], fa[p] = pf[j ++], deg[fa[p]] --;i = j; p = ++ tp;}
}

由上述重構過程可以看出:
任意一個長度為 n ? 2 n - 2 n?2,值域在 [ 1 , n ] [1, n] [1,n] 的序列,都能作為一個 P r u f e r Prufer Prufer 序列唯一的構造出一棵樹。并且任意兩個不同 P r u f e r Prufer Prufer 序列構造的樹都是不同的

這樣就完成了從 P r u f e r Prufer Prufer 序列到樹 的單射。結合上邊,就得到了:

n n n 個點編號為 1 ~ n 1 \sim n 1n 的無根樹與長度為 n ? 2 n - 2 n?2,值域為 [ 1 , n ] [1, n] [1,n] 的序列雙射

應用

Cayley 公式

n n n 個點有編號的完全圖生成樹個數為 n n ? 2 n^{n - 2} nn?2

證明:雙射即可。

[HNOI2004] 樹的計數

題意:
給定 n n n 個點的度數 d 1 , … d n d_1,\dots d_n d1?,dn?,任意兩個點之間可以連邊,問有多少個滿足度數數組的生成樹。

1 ≤ n ≤ 150 1 \leq n \leq 150 1n150

分析:
特判 n = 1 n = 1 n=1 的邊界情況。那么任意一個點的度數不能為 0 0 0,并且所有點的度數和應為 2 n ? 2 2n - 2 2n?2
一個點只要在 P r u f e r Prufer Prufer 序列中出現 d i ? 1 d_i - 1 di??1 即滿足構造出來的樹中度數為 d i d_i di?。這就是多重集的全排列。

CODE:

#include<bits/stdc++.h>
using namespace std;
const int N = 155;
typedef long long LL;
int n, deg[N], all;
LL res = 1, C[N][N];
int main() {scanf("%d", &n); int all = n - 2;for(int i = 0; i <= n; i ++ ) for(int j = 0; j <= i; j ++ ) if(!j) C[i][j] = 1;else C[i][j] = C[i - 1][j - 1] + C[i - 1][j];for(int i = 1; i <= n; i ++ ) {scanf("%d", &deg[i]);if(deg[i] == 0) {if(n == 1) {puts("1"); return 0;}else {puts("0"); return 0;}}res = res * C[all][deg[i] - 1];all -= deg[i] - 1;}if(all != 0) puts("0");else cout << res << endl;return 0;
}

「雅禮集訓 2017 Day8」共

題意:
給定 n , k n, k n,k。 你需要求出有多少個編號為 1 ~ n 1 \sim n 1n,以 1 1 1 為根的無向樹,滿足深度為奇數的點恰好有 k k k 個。 1 1 1 的深度認為是 1 1 1

1 ≤ k < n ≤ 5 × 10 5 1 \leq k < n \leq 5 \times 10^5 1k<n5×105

分析:
顯然可以將點按照深度的奇偶性分成兩類,這將樹變成了一張二分圖。
1 1 1 劃分到左部點中,那么需要從剩下的 n ? 1 n - 1 n?1 個編號里選出 k ? 1 k - 1 k?1 個分到左部點。答案就是 ( n ? 1 k ? 1 ) × S ( k , n ? k ) \binom{n - 1}{k - 1} \times S(k, n - k) (k?1n?1?)×S(k,n?k)
其中 S ( a , b ) S(a, b) S(a,b) 表示一張左部點有 a a a 個,右部點有 b b b 個的有標號完全二分圖的生成樹個數。
答案是 a b ? 1 b a ? 1 a^{b-1}b^{a - 1} ab?1ba?1
證明:
對于這樣二分圖的生成樹, P r u f e r Prufer Prufer 序列構造過程的末尾一定剩下一個左部點和一個右部點。因此它的 P r u f e r Prufer Prufer 序列一定有 b ? 1 b - 1 b?1 個左部點和 a ? 1 a - 1 a?1 個右部點。
對于這兩部分的構成的子序列內部,如果確定了編號和順序。那么兩部分之間在 P r u f e r Prufer Prufer 序列上的順序就定下來了。因此總方案數就是 a b ? 1 b a ? 1 a^{b - 1}b^{a - 1} ab?1ba?1

CODE:

// 這種雙射還真是秒啊
#include<bits/stdc++.h>
using namespace std;
const int N = 5e5 + 10;
typedef long long LL;
int n, k, p;
inline LL Pow(LL x, LL y) {LL res = 1, k = x;while(y) {if(y & 1) res = res * k % p;y >>= 1;k = k * k % p;}return res;
}
LL fac[N], inv[N];
int main() {cin >> n >> k >> p;fac[0] = 1; for(int i = 1; i < N; i ++ ) fac[i] = fac[i - 1] * i % p;inv[N - 1] = Pow(fac[N - 1], p - 2); for(int i = N - 2; i >= 0; i -- ) inv[i] = inv[i + 1] * (i + 1) % p;int L = k, R = n - k; LL res = fac[n - 1] * inv[k - 1] % p * inv[n - k] % p * Pow(L, R - 1) % p * Pow(R, L - 1) % p;cout << res << endl;return 0;
}

[THUPC 2018] 城市地鐵規劃

題意:

給定一個 n , k , m o d n, k, mod n,k,mod,然后給你一個 k k k 次多項式 f ( x ) f(x) f(x) 的每一項系數 a 0 , … , a k a_0,\dots,a_k a0?,,ak?。對于一個度數為 d d d 的點,它的貢獻為 f ( d ) ( m o d m o d ) f(d) \pmod{mod} f(d)(modmod)。你可以給編號為 1 ~ n 1 \sim n 1n 的點之間任意連邊,求所有生成樹中所有點貢獻和最大的方案,輸出最大貢獻和以及一組構造。

1 ≤ n ≤ 3000 , 0 ≤ k ≤ 10 , m o d = 59393 1 \leq n \leq 3000, 0 \leq k \leq 10, mod = 59393 1n3000,0k10,mod=59393

分析:
首先預處理出 i ∈ [ 1 , n ] i\in [1, n] i[1,n] 的所有 w i = f ( i ) w_i = f(i) wi?=f(i)
注意到任意一個 P r u f e r Prufer Prufer 序列都能構造出一棵樹,并且在這棵樹上一個點的度數為它在序列中的出現次數加一。因此有一個暴力的 d p dp dp
f i , j f_{i, j} fi,j? 表示考慮了編號為 1 ~ i 1 \sim i 1i 的點, 這些點在 P r u f e r Prufer Prufer 序列的出現總次數為 j j j 的最大代價。轉移枚舉 i + 1 i + 1 i+1 的出現次數 k k k 即可。最后的答案就是 f n , n ? 2 f_{n, n - 2} fn,n?2?
但是這樣 d p dp dp 的復雜度為 O ( n 3 ) O(n^3) O(n3),考慮優化:
注意到我們不關心每個點的出現次數,只關心 每種出現次數有幾個點。 所以可以以出現次數為階段 d p dp dp
f i , j f_{i, j} fi,j? 表示考慮了 1 ~ i 1 \sim i 1i 這些出現次數,當前總出現次數為 j j j 的最大代價。
那么轉移是: f i , j = max ? k = 0 ? j i ? ( f i ? 1 , j ? i × k + k × w i + 1 ) \Large{f_{i, j} = \max\limits_{k = 0}^{\left \lfloor \frac{j}{i} \right \rfloor}}(f_{i - 1, j - i \times k}+k \times w_{i + 1}) fi,j?=k=0max?ij???(fi?1,j?i×k?+k×wi+1?)

現在轉移復雜度就變成 O ( n ln ? n ) O(n\ln n) O(nlnn),總復雜度 O ( n 2 ln ? n ) O(n^2\ln n) O(n2lnn)
但是好像有個問題,我們沒有計算度數為 1 1 1 的點的貢獻,并且記錄的出現次數也沒辦法體現有多少個點的度數不是 1 1 1
肯定不能多加一維來記錄。我們考慮初始令 f 0 , 0 = n × w 1 f_{0, 0} = n \times w_1 f0,0?=n×w1?,然后每次轉移除了 + k × w i +k\times w_{i} +k×wi? 還要 ? k × w 1 -k\times w_1 ?k×w1? 表示把這 k k k 個點的代價換掉。
這樣就對了。構造只需要對每個狀態記錄前驅,然后任意拿一些編號構造 p r u f e r prufer prufer 序列即可。

復雜度 O ( n 2 ln ? n ) O(n^2 \ln n) O(n2lnn)
CODE:

// prufer 序列與有標號無根樹雙射的好處:任意 prufer 序列都能構造出一棵樹。因此只需要考慮 prufer 序列最優即可
// 對每個點去 dp 它在 prufer 序列出現多少次,復雜度 n^3 優化不了。
// 但是我們只關心每種次數有多少個。 對每個次數 dp 復雜度就降到了 n^2 ln n
#include<bits/stdc++.h>
using namespace std;
const int N = 4010;
const int mod = 59393;
int n, k, a[N];
int val[N], f[N][N], pre[N][N]; // f[i][j] 表示考慮了前 1~i 這些次數, 當前用的總次數為 j 的最優值
int fa[N], prufer[N], tot, p, deg[N];
inline void get_prufer(int x, int y) {if(!x) return ;if(pre[x][y] < y) {for(int i = 1; i <= (y - pre[x][y]) / x; i ++ ) {for(int j = 1; j <= x; j ++ ) prufer[++ tot] = p;p ++;}}get_prufer(x - 1, pre[x][y]);
}
inline void PT() {prufer[n - 1] = n;for(int i = 1; i <= n - 1; i ++ ) deg[prufer[i]] ++;int p = 1;for(int i = 1; i <= n - 1;) {int j = i;while(deg[p]) p ++; fa[p] = prufer[j ++], deg[fa[p]] --;int tp = p;while(j <= n - 1 && !deg[fa[tp]] && fa[tp] < p) tp = fa[tp], fa[tp] = prufer[j ++], deg[fa[tp]] --;i = j; p ++;}
}
int main() {scanf("%d%d", &n, &k);for(int i = 0; i <= k; i ++ ) scanf("%d", &a[i]);for(int i = 0; i <= n; i ++ ) {int v = 1;for(int j = 0; j <= k; j ++ ) {val[i] = (val[i] + v * a[j] % mod) % mod;v = v * i % mod;}}if(n == 1) {printf("0 %d\n", val[0]); return 0;}memset(f, 0xcf, sizeof f); f[0][0] = n * val[1]; // 初始所有度數都是 1for(int i = 1; i <= n - 2; i ++ ) {for(int j = 0; j <= n - 2; j ++ ) {for(int k = 0; k * i <= j; k ++ ) {if(f[i - 1][j - k * i] + k * val[i + 1] - k * val[1] > f[i][j]) {f[i][j] = f[i - 1][j - k * i] + k * val[i + 1] - k * val[1];pre[i][j] = j - k * i;}}}}printf("%d %d\n", n - 1, f[n - 2][n - 2]);p = 1;get_prufer(n - 2, n - 2);PT();for(int i = 1; i < n; i ++ ) printf("%d %d\n", i, fa[i]);return 0;
}

CF156D Clues

題意:
給定一張 n n n 個點, m m m 條邊的有標號無向圖,它有 k k k 個連通塊,求添加 k ? 1 k - 1 k?1 條邊使得圖聯通的方案數。答案對 p p p 取模。

1 ≤ n , m ≤ 10 5 , 1 ≤ p ≤ 10 9 1 \leq n,m \leq 10^5, 1 \leq p \leq 10^9 1n,m105,1p109

分析:
將連通塊縮成一個點,就轉換成了類似完全圖求生成樹的問題。
如果用連通塊的編號來構造 P r u f e r Prufer Prufer 序列,那么答案就是 k k ? 2 k^{k - 2} kk?2。這顯然不對,原因在于一個連通塊編號實際上代表了 s i z e size size 個點。
如果對于每一種以連通塊編號構造的 P r u f e r Prufer Prufer 序列,我們都把每個連通塊的編號換成任意連通塊內的點的編號。那么這實際上就等于將所有點的編號拿出來構造長為 k ? 2 k - 2 k?2 P r u f e r Prufer Prufer 序列,方案數為 n k ? 2 n^{k - 2} nk?2
這對不對呢?很遺憾,它也是不對的。
我們來嘗試理解這樣得到的 P r u f e r Prufer Prufer 序列有什么實際含義:相當于每次取出度數為 0 0 0 的編號最小的連通塊,然后把這個連通塊和 P r u f e r Prufer Prufer 序列開頭編號的連通塊相連,并且根據 P r u f e r Prufer Prufer 序列我們知道連向的點的編號就是序列開頭數字。
然后你就能發現問題所在了:我們不知道當前的 “葉子” 連出去的點編號是什么!!
因此開始的時候將答案乘上 ∏ s i z e i \prod size_i sizei? 表示先對每個連通塊欽定一個往外連出去的點的編號,然后再乘上 n k ? 2 n^{k - 2} nk?2 就行。

最后答案就是 n k ? 2 ∏ s i z e i n^{k - 2}\prod size_i nk?2sizei?。復雜度線性。

CODE:

#include<bits/stdc++.h>
using namespace std;
const int N = 1e5 + 10;
typedef long long LL;
int n, m, mod, sz[N], bin[N];
int Find(int x) {return x == bin[x] ? x : bin[x] = Find(bin[x]);}
inline void Merge(int u, int v) {int f1 = Find(u), f2 = Find(v);if(f1 != f2) sz[f2] += sz[f1], bin[f1] = f2;
}
inline LL Pow(LL x, LL y) {LL res = 1, k = x;while(y) {if(y & 1) res = res * k % mod;y >>= 1;k = k * k % mod;}return res;
}
int main() {ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);cin >> n >> m >> mod;for(int i = 1; i <= n; i ++ ) bin[i] = i, sz[i] = 1;for(int i = 1; i <= m; i ++ ) {int u, v; cin >> u >> v;Merge(u, v);}LL res = 1; int cnt = 0;for(int i = 1; i <= n; i ++ ) {if(Find(i) == i) res = res * sz[i] % mod, cnt ++;}if(cnt == 1) {cout << (1 % mod) << endl; return 0;}else {		res = res * Pow(n, cnt - 2) % mod;cout << res << endl;}return 0;
}

[ARC106F] Figures

題意:
N N N 個點,每個點有 d i d_i di?互不相同、可被區分 的孔,每次可以選擇兩個不同點,連接兩個未被連接過的孔,有多少種方案使得最后形成一棵樹。合法方案中可以不把孔填滿。答案對 998244353 998244353 998244353

2 ≤ N ≤ 2 × 10 5 , 1 ≤ d i < 998244353 2 \leq N \leq 2 \times 10^5, 1\leq d_i < 998244353 2N2×105,1di?<998244353

分析:
和上道題非常類似,只是一個聯通塊中的一個點只能被連接一次,上一道題是可以連接任意次。
一樣的思考方式,如果我們把所有孔的編號拿出來,有 M = ∑ d i M = \sum d_i M=di? 個孔,用 A M N ? 2 A_{M}^{N - 2} AMN?2? 來生成 P r u f e r Prufer Prufer 序列。
這樣還是不正確的,錯誤原因仍然是每個點作為葉子連出去時沒確定一個孔。
如果最后考慮這個孔是誰,我們還需要知道每個點有多少個孔在 P r u f e r Prufer Prufer 序列出現,這不太好。
還是最開始就考慮這個孔是誰,先乘上 ∏ d i \prod d_i di? 的系數,然后這些孔就不能用了,因此我們用 A M ? N N ? 2 A_{M - N}^{N - 2} AM?NN?2? 來構建 P r u f e r Prufer Prufer 序列。這樣就對了,答案就是 A M ? N N ? 2 ∏ d i A_{M - N}^{N - 2}\prod d_i AM?NN?2?di?

復雜度線性。

CODE:

#include<bits/stdc++.h>
using namespace std;
const int N = 2e5 + 10;
typedef long long LL;
const LL mod = 998244353;
int n, d[N];
LL res = 1;
inline LL A(LL n, LL m) {if(n < m) return 0;LL res = 1;for(LL i = n; i > n - m; i -- ) res = res * (i % mod) % mod;return res;
}
int main() {scanf("%d", &n); LL s = 0;for(int i = 1; i <= n; i ++ ) {scanf("%d", &d[i]); s += d[i] - 1;res = res * d[i] % mod;}res = res * A(s, n - 2) % mod; cout << res << endl;return 0;
}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/85239.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/85239.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/85239.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

高性能場景使用Protocol Buffers/Apache Avro進行序列化怎么實現呢

我們以Protocol Buffers&#xff08;Protobuf&#xff09;和Apache Avro為例&#xff0c;分別展示高性能序列化的實現方式。 由于兩者都需要定義Schema&#xff0c;然后生成代碼&#xff0c;因此步驟包括&#xff1a; 1. 定義Schema文件 2. 使用工具生成Java類 3. 在代碼中…

iOS端網頁調試 debug proxy策略:項目中的工具協同實踐

移動開發中的調試&#xff0c;一直是效率瓶頸之一。特別是當前 Web 前端與 App 原生高度耦合的背景下&#xff0c;頁面調試不僅受限于瀏覽器&#xff0c;還要面對 WebView 實現差異、系統權限控制、設備多樣性等復雜情況。 但我們是否可以構建一套**“設備無關”的調試工作流*…

springboot項目啟動報錯:spring boot application in default package

啟動類報錯&#xff1a; 問題&#xff1a; springboot的啟動方法不能直接在java目錄下 解決&#xff1a; 1.使用CompentScan 和EnableAutoConfiguration注解 2.啟動類放在java目錄下的package目錄下

機器學習實驗報告5-K-means 算法

4.1 k-means算法簡介 聚類分析&#xff0c;作為機器學習領域中的一種無監督學習方法&#xff0c;在數據探索與知識發現過程中扮演著舉足輕重的角色。它能夠在沒有先驗知識或標簽信息的情況下&#xff0c;通過挖掘數據中的內在結構和規律&#xff0c;將數據對象自動劃分為多個類…

【已解決】yoloOnnx git工程部署

首先 yoloonnx一個VS工程下來整個工程大概1-2個g的大小因此在git的過程中總是會因為文件超過100M而觸發報錯&#xff0c;上傳不上去&#xff0c;因此現在需要做一個過濾才能把工程重新上傳上去&#xff0c;那么這個時候別人需要下載下來的時候確實不完整的工程&#xff0c;因此…

如何輕松地將照片從電腦傳輸到安卓手機

一些安卓用戶正在尋找有效可靠的方法&#xff0c;將照片從電腦傳輸到安卓設備。如果您也想將有趣或難忘的照片導入安卓手機或平板電腦&#xff0c;可以參考這篇文章&#xff0c;它提供了 6 種可靠的方法&#xff0c;讓您輕松傳輸照片。 第 1 部分&#xff1a;如何通過 Android …

準備純血鴻蒙理論高級認證的一些心得

最近在準備純血鴻蒙理論高級認證&#xff0c;一些心得記錄下來&#xff0c;希望早日考過高級&#xff01; 一、考試目標&#xff1a; HarmonyOS核心技術理念HarmonyOS應用架構設計ArkTS原理和實踐ArkUI開發HarmonyOS關鍵技術能力開發工程管理、代碼編輯、調試與定位應用上架運…

義烏購拍立淘API接入指南

一、接口概述 拍立淘是義烏購平臺提供的以圖搜貨服務&#xff0c;通過HTTP RESTful API實現。當前版本為v3.2&#xff0c;支持JPG/PNG格式圖片&#xff08;≤5MB&#xff09;&#xff0c;返回相似商品列表及供應鏈信息。 二、接入準備 申請開發者賬號 # 開發者注冊示例&…

Web 連接和跟蹤

大家讀完覺得有幫助記得及時關注和點贊&#xff01;&#xff01;&#xff01; 抽象 網絡跟蹤是一種普遍且不透明的做法&#xff0c;可實現個性化廣告、重新定位和轉化跟蹤。 隨著時間的推移&#xff0c;它已經演變成一個復雜的侵入性生態系統&#xff0c;采用越來越復雜的技術來…

前端技術棧與 SpreadJS 深度融合:打造高效數據表格應用

引言 在當今數字化的時代&#xff0c;數據表格應用在各種 Web 項目中扮演著至關重要的角色。從企業級的管理系統到電商平臺的商品展示&#xff0c;數據表格都是用戶與數據交互的重要界面。前端技術棧如 JavaScript、HTML 和 CSS 為構建用戶界面提供了強大的工具和方法&#xf…

如何用ai描述缺陷(bug)

附件1&#xff1a; 附件2&#xff1a; 將附件1和附件2發送給deepseek&#xff0c;且輸入對話框的文字&#xff1a; 然后進入禪道用戶登錄 - 禪道 ### **缺陷報告&#xff1a;登錄功能無響應缺陷** **提交平臺**&#xff1a;禪道缺陷管理系統 **發現環境**&#xff1a;測試環…

軟考 系統架構設計師系列知識點之雜項集萃(89)

接前一篇文章&#xff1a;軟考 系統架構設計師系列知識點之雜項集萃&#xff08;88&#xff09; 第161題 下面可提供安全電子郵件服務的是&#xff08; &#xff09;。 A. RSA B. SSL C. SET D. S/MIME 正確答案&#xff1a;D。 解析&#xff1a; MIME&#xff08;Multi…

開源 Arkts 鴻蒙應用 開發(一)工程文件分析

文章的目的為了記錄使用Arkts 進行Harmony app 開發學習的經歷。本職為嵌入式軟件開發&#xff0c;公司安排開發app&#xff0c;臨時學習&#xff0c;完成app的開發。開發流程和要點有些記憶模糊&#xff0c;趕緊記錄&#xff0c;防止忘記。 相關鏈接&#xff1a; 開源 Arkts …

protobuf遇到protoc-gen-go: unable to determine Go import path for “xxx“

問題 這個錯誤是因為 .proto 文件中缺少必需的 go_package 選項。在 protobuf 生成 Go 代碼時&#xff0c;這是關鍵配置項。 pandaVM:~/dev/pb$ protoc --go_out. pb.proto protoc-gen-go: unable to determine Go import path for "pb.proto"Please specify eithe…

linux unix socket 通信demo

好&#xff0c;下面是已經整合完善的版本&#xff1a; ? 功能點&#xff08;你要求的全部實現了&#xff09;&#xff1a; Unix Domain Socket (SOCK_STREAM) 服務端先啟動&#xff1a;正常通信 客戶端先啟動&#xff1a;等待服務端直到連接成功 客戶端每秒發送一條消息 服務端…

近期GitHub熱榜推薦

【1】fluentui-system-icons (HTML) &#x1f468;?&#x1f4bb; 作者&#xff1a; microsoft &#x1f4e6; 倉庫&#xff1a; microsoft / fluentui-system-icons &#x1f310; 鏈接&#xff1a; https://github.com/microsoft/fluentui-system-icons ? 星標&#xf…

Jupyter 是什么?基于瀏覽器的交互式計算環境

&#x1f9e0; 一、Jupyter 是什么&#xff1f; Jupyter 是一個基于瀏覽器的交互式計算環境&#xff0c;名字取自Julia Python R 三種語言&#xff0c;但現在已支持超過40種編程語言。它最核心的功能是讓你在同一個文檔&#xff08;.ipynb 文件&#xff09;中混合編寫代碼、…

CTF解題:[NSSCTF 2022 Spring Recruit]弱類型比較繞過

一、漏洞背景介紹 在 CTF&#xff08;Capture The Flag&#xff09;競賽和 Web 安全測試中&#xff0c;PHP 語言的類型比較漏洞是常見的考點。這類漏洞源于 PHP 的弱類型特性&#xff0c;即當使用進行比較時&#xff0c;PHP 會自動進行類型轉換&#xff0c;從而導致一些不符合…

【SQL】存儲過程 vs 普通 SQL

一、存儲過程 vs 普通 SQL 的核心區別 先明確兩者的本質&#xff1a; 普通 SQL&#xff1a;是直接執行的查詢 / 操作語句&#xff08;如SELECT、INSERT&#xff09;&#xff0c;每次執行都要編譯&#xff0c;邏輯寫在應用端或直接運行。存儲過程&#xff1a;是預編譯并存儲在…

Vue.js第一節

初識Vue、插值操作、屬性綁定 初識&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>D…