uva1395 Kruskal算法求最小生成树

来源:互联网 发布:足球基本面分析软件 编辑:程序博客网 时间:2024/04/29 01:27

注意并查集的实现方法。

#include<iostream>#include<cstring>#include<cstdlib>#include<cstdio>#include<cmath>#include<string>#include<map>#include<set>#include<algorithm>#include<vector>#include<stack>#include<sstream>#define ll long longusing namespace std;const int M_NUM_MAX = 100+5;const int M_INT_MAX = 0x7fffffff;const double M_DBL_MAX = 1.7976931348623158e+308;const double M_DBL_MIN = 2.2250738585072014e-308;/*********************************************************************/struct edge{  int x,y;  int d;  bool operator < (const edge& dst) const{return d<dst.d;}}theEdge[M_NUM_MAX*(M_NUM_MAX-1)/2];int p[M_NUM_MAX];/*********************************************************************/int min (int& a, int& b){return a<b?a:b;}int findParent (int i){return p[i]==i?i:p[i]=findParent(p[i]);}//查找i的最原始祖先,并将其他祖先的父亲置为最原始祖先/*********************************************************************/int main(){  //freopen ("in.txt","r",stdin);  int n,m;  while (scanf ("%d%d",&n,&m) && (n!=0||m!=0) )  {for (int i = 0; i < m; i++)  scanf ("%d %d %d",&theEdge[i].x, &theEdge[i].y, &theEdge[i].d); sort (theEdge,theEdge+m);int minNum=M_INT_MAX;for (int i=0;i<m;i++){  for (int j=0;j<=n;j++) p[j]=j;  int cnt=0,r;  bool success=false;  for (int j=i;j<m&&!success;j++){int x=findParent(theEdge[j].x),y=findParent(theEdge[j].y);if (x!=y){//如果边j的两个端点不在一个并查集,说明该点不在一个连通图  p[x]=y;//加入连通图  cnt++;  r=j;}if (cnt==n-1)  success=true;  }   if (success)minNum=min(minNum,theEdge[r].d-theEdge[i].d);}if (minNum==M_INT_MAX)  printf ("-1\n");else printf ("%d\n",minNum);   }  return 0;}


0 0
原创粉丝点击