国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 學(xué)院 > 開(kāi)發(fā)設(shè)計(jì) > 正文

BZOJ 1016, 最小生成樹(shù)計(jì)數(shù)

2019-11-10 22:20:53
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

PRoblem

傳送門(mén)

Mean

給定一張簡(jiǎn)單無(wú)向加權(quán)圖,求其最小生成樹(shù)方案數(shù)。

Analysis

貌似有一個(gè)Matrix Tree定理……但是感覺(jué)目前不是很學(xué)得進(jìn)東西,所以還是打了dfs。 先跑一遍Kruskal,統(tǒng)計(jì)不同權(quán)值的邊各出現(xiàn)幾次。 然后dfs判斷某一種權(quán)值的邊的方案數(shù),累乘即可。 需要注意的是并查集不可以路徑壓縮,那樣會(huì)導(dǎo)致連通塊合并后無(wú)法分開(kāi)。

Code

#include<cstdio>#include<algorithm>using namespace std;const int N=105,M=1005,MOD=31011;int n,m,cnt,tot,ans=1,f[N];struct Edge{ int a,b,c; bool Operator < (const Edge &b) const {return c<b.c;}}e[M],t[M];int find(int x){return f[x]==x?x:find(f[x]);}int dfs(int x,int p,int cnt){ if(p==t[x].b+1) return cnt==t[x].c?1:0; int sum=0; int a=find(e[p].a),b=find(e[p].b); if(a!=b){ f[a]=b; sum+=dfs(x,p+1,cnt+1); f[a]=a,f[b]=b; } return sum+dfs(x,p+1,cnt);}int main(){ scanf("%d%d",&n,&m); for(int i=1;i<=n;i++) f[i]=i; for(int i=1;i<=m;i++){scanf("%d%d%d",&e[i].a,&e[i].b,&e[i].c);} sort(e+1,e+m+1); for(int i=1;i<=m;i++){ int a=find(e[i].a),b=find(e[i].b); if(e[i].c!=e[i-1].c){t[cnt].b=i-1,t[++cnt].a=i;} if(a!=b){ f[a]=b; t[cnt].c++,tot++; } } if(tot!=n-1){printf("0");return 0;} for(int i=1;i<=n;i++) f[i]=i; t[cnt].b=m; for(int i=1;i<=cnt;i++){ (ans*=dfs(i,t[i].a,0))%=MOD; for(int j=t[i].a;j<=t[i].b;j++){ int a=find(e[j].a),b=find(e[j].b); if(a!=b) f[a]=b; } } printf("%d",ans);}
發(fā)表評(píng)論 共有條評(píng)論
用戶(hù)名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 宁强县| 天柱县| 安远县| 忻城县| 蓝田县| 昌吉市| 泾川县| 盐津县| 曲沃县| 乐山市| 介休市| 吴江市| 恩平市| 宣汉县| 广河县| 旬邑县| 昌都县| 大悟县| 普宁市| 红安县| 喀什市| 当阳市| 抚顺市| 柯坪县| 阳曲县| 郸城县| 吐鲁番市| 米林县| 榆树市| 莒南县| 澄江县| 沁阳市| 盘山县| 兴城市| 江城| 普宁市| 宁南县| 永修县| 堆龙德庆县| 普兰店市| 清苑县|