标签:name comment tle out i++ 题目 title 最小 bool
题目:给一个矩阵告诉每条边的权,求最小生成树。
题解:建树之后直接用kruskal。
代码:
#include <algorithm>#include <iostream>using namespace std;struct node{//每条边的两顶点以及距离 int from; int to; int len;}edge[5000];int f[110];int ans,n,m;bool cmp(node a, node b){ return a.len < b.len;}int find(int x){//并查集 while(x!=f[x]){ x=f[x]; } return x;}void join(int x,int y){ int fx=find(x); int fy=find(y); if(fx!=fy) f[fx]=fy;}int kruskal(){//最小生成树 sort(edge,edge+m,cmp);//边长度由小到大排序 ans = 0; for(int i=0;i<=n;i++) f[i] = i; for(int j = 0; j < m; j++){ if(find(edge[j].from) != find(edge[j].to)){//如何两点未在一个并查集便合并 join(edge[j].from,edge[j].to); ans+=edge[j].len; //cout<<ans<<endl; } } return ans;}int main(){ while(cin>>n){ m = n * (n-1) / 2; int tot=0,x; for(int i=0;i<n;i++) for(int j=0;j<n;j++){ cin>>x; if(j<i) { edge[tot].from=i+1; edge[tot].to=j+1; edge[tot].len=x; tot++; } } cout<<kruskal()<<endl; }}
poj 1258
原文地址:http://www.cnblogs.com/LMissher/p/7403071.html