1. 程式人生 > >克魯斯卡爾

克魯斯卡爾

bool cin ace truct span algo logs namespace using

#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
using namespace std;
int f[100000];
struct node
{
    int a;
    int b;
    int c;
}s[100000];
bool cmp(const node & x,const node & y){return x.c<y.c;}
int fuqin(int h) { if(f[h]==h) return h; else { f[h]=fuqin(f[h]); return f[h]; } } int main() { int n; int m; cin>>n>>m; int i,j,k; for(i=1;i<=m;i++) { cin>>s[i].a>>s[i].b>>s[i].c; }
for(i=1;i<=n;i++) f[i]=i; sort(s+1,s+m+1,cmp); int ans=0,maxx=0; for(i=1;i<=m;i++) { int h1=fuqin(s[i].a); int h2=fuqin(s[i].b); if(h1!=h2) { f[h2]=h1; maxx++; ans+=s[i].c; } if(maxx==n-1
) break; } cout<<ans; return 0; } /* 5 6 1 2 2 2 3 1 2 3 2 3 4 3 4 5 2 5 4 9 */

克魯斯卡爾的核心是,給邊排序。選出每兩個點的最短路徑。直到圖連通,需要n-1條邊。

克魯斯卡爾