1. 程式人生 > 實用技巧 >kruskal 處理最短路 問題 A: 還是暢通工程

kruskal 處理最短路 問題 A: 還是暢通工程

#include<iostream>
#include<algorithm>
#include<cstring>
#include<vector>
#include<map>
#include<cmath>
#include<cstdio>
#include<queue>
typedef long long ll;
const int mod = 1e9+7;
const int maxn = 1000000;
const int inf = 0x3f3f3f3f;
int m;
using namespace std;
int pre[maxn]; struct node { int x; int y; int z; }pos[maxn]; int cmp(node x,node y) { if(x.z < y.z) return 1; return 0; } void init()//初始化 { for(int i=0;i<=m;i++) { pre[i]=i; } } int Find(int x) //找掌門函式 { while(x!=pre[x]) x=pre[x];
return x; } void uoin(int x,int y)//打架函式 { int fx=Find(x); int fy=Find(y); if(fx!=fy) { pre[fx]=fy; } } int main() { ios::sync_with_stdio(false); cin.tie(0);cout.tie(0); while(scanf("%d",&m),m) { int i; int n = m * (m-1
) / 2; for(int i =1;i<=m;i++) { pre[i]=i; } for(i=1;i<=n;i++) { cin>>pos[i].x>>pos[i].y>>pos[i].z; } sort(pos+1,pos+1+n,cmp);//排序加邊 找最小 int minm = 0; int cnt=0; for(i=1;i<=n;i++) { if(Find(pos[i].x)!=Find(pos[i].y))//掌門不同 { uoin(pos[i].x,pos[i].y);//打一架 minm+=pos[i].z;//加權 cnt++;//有幾個點在樹裡面 if(cnt == m-1) { break; } } } cout<<minm<<endl; } return 0; }

關於找掌門函式和打架函式的意思(並查集)

https://blog.csdn.net/qq_41593380/article/details/81146850