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

首頁 > 學(xué)院 > 開發(fā)設(shè)計 > 正文

MST唯一性判斷

2019-11-11 04:10:32
字體:
供稿:網(wǎng)友

模板題: fzu2087 統(tǒng)計樹邊

解法(mengxiang000000的博客 )

思路:用kruskal算法模擬生成樹的過程。同時也是一個貪心生成樹的過程,我們知道,生成的樹的邊權(quán)值和是一定的,那么對于邊的替換的值也是能夠確定的:只有權(quán)值相同的邊才有可能是另一種生成樹方法的邊。

然后我就呆萌的記錄有多少重邊權(quán)值的邊,然后加上n-1,開開心心的提交,實力WA。一組數(shù)據(jù)就可以干掉我: 3 3 1 2 1 1 2 2 2 3 1

所以記得一定不要跟我犯一樣的錯誤,我們需要的是動態(tài)判斷一條邊權(quán)值相同的邊能否可能是另一種生成樹方法的邊。我們直接在kruskal算法過程中加上動態(tài)判斷的成分就可以了,那么要如何判斷呢?遍歷每一條邊的時候,如果有相同權(quán)值的邊,像kruskal一樣的判斷條件,判斷這條邊能否加入生成樹中即可。

kruskal算法判斷一條邊是否能夠貪心的加入生成樹中:

for(int i=0;i<m;i++) { if(find(a[i].x)!=find(a[i].y)) { zhongquanzhi+=a[i].w; merge(a[i].x,a[i].y); } }

我們對同權(quán)值的邊判斷能否加入生成樹中,并且別忘記對邊要進(jìn)行入樹:

for(int i=0;i<m;i=j) { for(j=i;a[i].w==a[j].w;j++) { if(find(a[j].x)!=find(a[j].y)) { output++; } } for(j=i;a[i].w==a[j].w;j++) { if(find(a[j].x)!=find(a[j].y)) { merge(a[j].x,a[j].y); } } }

簡而言之 如果安全,則先不Union,先統(tǒng)計最小生成樹的邊數(shù),待統(tǒng)計完后再Union; poj1679 與此題類似

fzu2087

#include<iostream>#include<algorithm>using namespace std;const int maxn=100005;typedef struct node{ int st,ed,cost;}Edge ;Edge edge[100005];int cmp(Edge a,Edge b){ return a.cost<b.cost;}int fa[maxn];void init(){ for(int i=0;i<maxn;i++) fa[i]= i;}int Find(int x){ if(fa[x] == x) return fa[x]; else return fa[x] = Find(fa[x]);}void Union(int x,int y){ int fx=Find(x),fy=Find(y); if(fx!= fy) fa[fx] = fy;}int main(){ ios_base::sync_with_stdio(false); int T; cin>>T; while(T--){ int n,m,t1,t2,t3; cin>>n>>m; for(int i=0;i<m;i++){ cin>>t1>>t2>>t3; edge[i].st=t1,edge[i].ed=t2,edge[i].cost=t3; } sort(edge,edge+m,cmp); int bianshu=0; int tot_cost = 0; init(); for(int i=0;i < m ;i++){ for(int j=i;edge[j].cost == edge[i].cost;j++) if(Find(edge[j].st)!= Find(edge[j].ed)) bianshu++; for(int j=i;edge[j].cost == edge[i].cost;j++) if(Find(edge[j].st)!= Find(edge[j].ed) ) Union(edge[j].st,edge[j].ed),tot_cost+=edge[j].cost; } cout<<bianshu<<endl; }}
發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 大埔县| 岳西县| 青州市| 天柱县| 临清市| 襄垣县| 淄博市| 和政县| 淳化县| 庆安县| 堆龙德庆县| 龙里县| 芦山县| 阿图什市| 盐城市| 将乐县| 浪卡子县| 安塞县| 咸宁市| 田林县| 扶绥县| 当阳市| 铁岭市| 昌图县| 汕尾市| 芷江| 新郑市| 昌黎县| 剑川县| 泗洪县| 桃源县| 从化市| 犍为县| 绥德县| 昌邑市| 容城县| 定州市| 凤山县| 安新县| 平遥县| 庄河市|