Description
Input
Output
Sample Input
3 0 990 692 990 0 179 692 179 0 1 1 2
Sample Output
179
Source
这道题,我们只需要把原本已经连好的边把权值当成0,那么我们在进行最小生成树算法的时候,总会优先把这些边连上。点击传送
kruskal
#include <algorithm> #include <iostream> #include <cstring> #include <cstdio> using namespace std; struct node { int x,y,dis; }Edge[100001]; int fa[1001],N,i,a,tot,j,k; bool cmp(node a,node b) { return a.dis<b.dis; } int find_fa(int k) { return fa[k]==k?k:find_fa(fa[k]); } int main() { cin>>N; int a; for(i=1;i<=N;++i) { for(j=1;j<=N;++j) { cin>>a; if(a) { tot++; Edge[tot].x=i; Edge[tot].y=j; Edge[tot].dis=a; } } } int Q; cin>>Q; int b,c; for(i=1;i<=N;++i) fa[i]=i; int h=0; while(Q--) { cin>>b>>c; tot++; Edge[tot].x=b; Edge[tot].y=c; Edge[tot].dis=0; } sort(Edge+1,Edge+1+tot,cmp); int ans=0; for(i=1;i<=tot;++i) { int x,y; x=find_fa(Edge[i].x); y=find_fa(Edge[i].y); if(x!=y) { fa[y]=x; h++; ans+=Edge[i].dis; if(h==N-1) break; } } cout<<ans; return 0; }
原文:http://www.cnblogs.com/ruojisun/p/6360992.html