P4208 JSOI2008 最小生成樹計數

2022-05-24 13:57:09 字數 957 閱讀 4390

思路

剛看到的時候,因為 \((n\leq 100)\) ,所以想到了爆搜,但是這樣做顯然會 \(tle\) ,所以我們手摸幾組資料找找結論

然後能發現乙個結論:一張圖上的不同最小生成樹中,權值相等的邊的個數是不變的

小證明:用kruskal求最小生成樹時,每一步都是最優的,如果有不同的最小生成樹,則當前步的權值必然小於等於之前最小生成樹當前步的選擇。但是反證可得,如果有小於的話,此時的最小生成樹就比之前的優了,和之前矛盾,所以權值相等的邊的個數是不變的。

**

#includeusing namespace std;

const int mod=31011;

struct nodee[1010];

struct kruskala[1010];//存i邊的個數,l r是左右端點,v是i在最小生成樹上的個數

int n,m,f[110],ans,q[110],num,sum;

int find(int x)

//不能路徑壓縮!!!

bool cmp(node a,node b)

void dfs(int x,int now,int k)//x是你當前找的值 now是第幾個邊 k是你選了的個數

int xx=find(e[now].from),yy=find(e[now].to);

if(xx!=yy)//看是否選這邊就為環

dfs(x,now+1,k);//不選

}int main()//kruskal

if(tot!=n-1)//如果構不成樹,就可以輸出0了

a[num].r=m;

ans=1;

for(int i=1;i<=n;i++) f[i]=i;

for(int i=1;i<=num;i++)//弄完乙個後,連起來保證不為環

}printf("%d",ans);

return 0;

}

P4208 JSOI2008 最小生成樹計數

現在給出了乙個簡單無向加權圖。你不滿足於求出這個圖的最小生成樹,而希望知道這個圖中有多少個不同的最小生成樹。如果兩顆最小生成樹中至少有一條邊不同,則這兩個最小生成樹就是不同的 輸出方案數對31011的模 摘自大佬部落格 find並查集 inline int pls int a,int b 模數不為質...

P4208 JSOI2008 最小生成樹計數

這題竟然不是生成樹計數?直接暴力就行。我們需要知道乙個性質,就是最小生成樹無論長成啥樣,邊權數量是一定的。然後用乘法原理一算就行啦。好像還有生成樹計數的作法,太麻煩了,就不寫了。題幹 題目描述 現在給出了乙個簡單無向加權圖。你不滿足於求出這個圖的最小生成樹,而希望知道這個圖中有多少個不同的最小生成樹...

P4208 JSOI2008 最小生成樹計數

題目描述 現在給出了乙個簡單無向加權圖。你不滿足於求出這個圖的最小生成樹,而希望知道這個圖中有多少個不同的最小生成樹。如果兩顆最小生成樹中至少有一條邊不同,則這兩個最小生成樹就是不同的 由於不同的最小生成樹可能很多,所以你只需要輸出方案數對 31011 的模就可以了。容易想到對於邊權相同的那些邊,選...