克魯斯卡爾
阿新 • • 發佈:2017-10-19
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條邊。
克魯斯卡爾