ディレクトリ
最小スパニングツリー
\(で:フィールド\)
- 定義:\(N- \)図の通信ノードにまたがるは、接続されたサブグラフ最小限の原画像であり、全てのオリジナル含ま\(N- \)ノードを、図の通信を保持します最小限の側。最小スパニングツリーをすることができる(クラスカル\)\アルゴリズムまたは\(プリム\)由来のアルゴリズム。
クラスカル
定義:\(クラスカル\)は貪欲取得の考えに基づいています。
すべての点が同じになるまで、この辺の両端点は、それらが結合されます、同じセットに属していない場合はまず、我々は、各エッジを選択するため、その後、昇順に重量に応じてすべてのエッジを置きますこれまでのコレクション。私たちは別のアルゴリズムを考えることができ、ここを参照してください-はっきりそれを置く、ばらばらのセット、\(クラスカル\)アルゴリズムは、に基づいており、貪欲アルゴリズムのセットを確認しています。- 時間計算:\(O(MlogM)\) \(M \)は、グラフのエッジの総数です。
基本的な考え方:\(クラスカルは\)は常に2つのエンドポイント間の通信がないかを決定するために、現在利用可能な最も小さい側の右端、最小エッジコネクタの右端を選択するたびに選択し、側優位です。
おかげGYHギャング「スポンサーシップ」:(以下のようにコード)があります
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
struct edge
{
int u,v,w;//分存每一条边前,后坐标与权值
}a[3000010];
int n,m,num;//存边的数量
int pre[1000010];//存并查集中的祖先
bool cmp(edge aa,edge bb)
{
return aa.w<bb.w;
}//结构体sort排序必须自定义排序函数
void add(int u,int v,int w)
{
a[++num].u=u;
a[num].v=v;
a[num].w=w;
}
int find(int x)
{
return pre[x]==x?x:pre[x]=find(pre[x]);
}
void join(int x,int y)//并集
{
int r1=find(x),r2=find(y);
if(r1!=r2)
{
pre[r1]=r2;
}
}
signed main()
{
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)
{
pre[i]=i;//重置先祖
}
for(int j=1;j<=m;j++)
{
int u,v,w;
scanf("%d%d%d",&u,&v,&w);//输入各边权值
add(u,v,w);
}
sort(a+1,a+num+1,cmp);
int sum=0;
for(int i=1,tot=0;i<=num&&tot!=n;i++)
{
if(find(a[i].u)==find(a[i].v))
{
continue;
}
join(a[i].u,a[i].v);
++tot;
sum+=a[i].w;
}
printf("%d",sum);//输出
return 0;
}