1. 程式人生 > 其它 >SSL_1682&&P1546【最短網路】

SSL_1682&&P1546【最短網路】

技術標籤:圖論並查集圖論

最短網路

題目

簡化題意:
最小生成樹,鄰接矩陣讀入,3<=n<=100
沒錯就是這麼水


解析

看到題面,恍然大悟
又一道水題
突然發現了一個問題:
為什麼這道題我A了?
調出記錄,在2020 12 3時我A了這道題
調出日曆,發現是閒的發慌時用kruskal做的
愣住
好吧,這麼相似的一道題我也不囉嗦了(真懶),想看的自己看這一題:
SSL_1612【最優佈線問題】&&P3366【【模板】最小生成樹】
扔個程式碼就跑:

code:

#include<iostream>
#include<cstdio>
#include
<algorithm>
using namespace std; struct node { int a,b,w; }a[10000]; int n,tot=0,f[110],xx,s,m; void add(int x,int y,int z) { a[++tot].a=x; a[tot].b=y; a[tot].w=z; } bool cmp(node x,node y) { return x.w<y.w; } int find(int dep) { if(f[dep]==dep)return dep; return f[dep]=find(f[dep]);//路徑壓縮 }
int main() { cin>>n; m=n*(n-1); for(int i=1;i<=n;i++) { for(int j=1;j<=i;j++)scanf("%d",&xx); for(int j=i+1;j<=n;j++) { scanf("%d",&xx); add(i,j,xx); add(j,i,xx); } f[i]=i; } sort(a+1,a+m+1,cmp); for(int i=1;i<=m;i++) { if(find
(a[i].a)!=find(a[i].b)) { f[find(a[i].b)]=find(a[i].a); n--; s+=a[i].w; if(n==1) { printf("%d",s); return 0; } } } return 0; }//雙向建邊,並查集,kruskal,快樂源泉