51nod 1446 價值限制樹

2022-09-08 23:03:28 字數 2073 閱讀 3151

51nod-1446-價值限制樹

真·一調一下午。

題意:給\(n\)個點,每個點有權值\(a_i\),若\(a_i=-1\)稱這個點\(not good\),否則是\(good\)的。形成任意一棵生成樹後若\(good\)的點相鄰的點有\(good\)點,則稱該點是\(great\)的。生成樹的價值是所有\(great\)的點的權值和。給定\(maxval\)值,求所有生成樹價值不超過\(maxval\)的生成樹個數。

題解:顯然需要建圖跑矩陣樹定理。可以發現乙個性質,就是在\(good\)的點中選出幾個點作為\(great\)點之後,形成的生成樹方案是一定的。所以設\(f[i]\)為選出了\(i\)個點作為\(great\)點的生成樹方案,發現\(f[i]\)並不能建圖後直接求。不妨設\(h[i]\)表示最多有\(i\)個點是\(great\)點的生成樹種類,則只需將\(great\)點相互連邊,不是\(good\)的點向其他點連邊,然後跑矩陣樹定理即可求\(h[i]\)。

由於\(h[i]\)的狀況是有i個點可以互相連通形成\(great\)點的生成樹方案數,實際上可能若這\(i\)個點中某個點成為葉子節點,且父節點是\(not good\)的節點,那麼會不滿\(i\)個,此時會有\(j\)個節點被選出,這樣的情況總和是\(\sum^_c_^f[j]\),於是由容斥定理:

\[f[i]=h[i]-\sum^_c_^f[j]

\]可以計算出\(f[i]\) 。

在每種\(f[i]\)的情況下,需要滿足價值不超過\(maxval\)的限制條件。也就是我們在所有\(good\)的點中選i個使其權值和不超過\(maxval\)。

設其種類數為\(g[i]\),則可以使用折半搜尋\((n≤40)\)計算出結果。折半搜尋的模版是:p4799世界冰球錦標賽

於是我們要求的總答案即為\(\sum_^f[i]g[i]\)

#include using namespace std;

#define ll long long

#define mod (ll)(1e9+7)

const int maxn=3e5+10;

int t,n,maxval,gd,ngd;

ll yuan[50],f[50],g[50],h[50];

ll gdb[50],bd[50];

bool good[50];

int qian[50][maxn],hou[50][maxn],cntq[50],cnth[50];//vector

void pre()

struct matrix

}du;

ll gauss()

}ans=(ans*du.ma[i][i]%mod+mod)%mod;

}n++;

return (ans+mod)%mod;

}void solh()

}for(int j=gd+1;j<=n;j++)

dfsq(qian1+1,hou1,(val+yuan[gdb[qian1]]),ge+1);

dfsq(qian1+1,hou1,val,ge);

}void dfsh(int qian1,int hou1,int val,int ge)

dfsh(qian1+1,hou1,(val+yuan[gdb[qian1]]),ge+1);

dfsh(qian1+1,hou1,val,ge);

}void solg()

else if(gd==0) return;

g[0]=0;

dfsq(1,mid,0,0);dfsh(mid+1,gd,0,0);

for(int i=1;i<=gd;i++)

for(int i=0;i<=gd;i++)}}

}int cm[50][50];

signed main()

}while(t--)

solh();

for(int i=0;i<=gd;i++)

solg();

ll ans=0;

for(int i=0;i<=gd;i++) ans=(ans+(ll)f[i]*g[i]%mod)%mod;

cout<}

return 0;

}

51nod 1446 限制價值樹

有n個點 n 40 標記為0,1,2,n 1,每個點i有個價值val i 如果val i 1那麼這個點被定義為bad,否則如果val i 0那麼這個點為定義為good。現在給這n個點間連上n 1條邊,使它們構成乙個生成樹,定義樹中的點為great點當且僅當這個點本身是good點且與其相鄰的點中至少有...

51Nod1446 限制價值樹

講課時候一點兒都沒懂 分成兩個部分 找到所有滿足sum mx的集合,即列舉哪些是great的 統計每個great的集合對應多少個樹 發現,第二個部分只和great集合大小有關 具體的第乙個部分 折半爆搜 sort 雙指標,得到g i 大小為i的great集合個數 第二部分 f i 表示欽定i個是gr...

51Nod 1296 有限制的排列

acm模版 個人感覺,這個應該算是數字 dp。先通過處理輸入資料獲取乙個 state,表示每相鄰兩項之間的大小關係,state i 0,表示無特別關係,state i 1 表示第 i 項小於第 i 1 項,state i 2 表示第 i 項大於第 i 1 項。接著搞乙個 dp i j 表示由前 i ...