SSL_1682&&P1546【最短網路】
阿新 • • 發佈:2021-01-03
最短網路
題目
簡化題意:
最小生成樹,鄰接矩陣讀入,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,快樂源泉