hdu1102 kruskal算法求最小生成树

来源:互联网 发布:mac不能玩游戏吗2017 编辑:程序博客网 时间:2024/04/28 14:26

裸的kruskal。

#include<iostream>#include<cstring>#include<cstdlib>#include<cstdio>#include<cmath>#include<string>#include<map>#include<set>#include<algorithm>#include<vector>#include<queue>#include<stack>#include<sstream>#define LL long long#define OJ_DEBUG 0#define READ_FILE 0using namespace std;const int NN_MAX = 110;const int MM_MAX = 100010;const int INF = 0x3fffffff;struct Edge{  int a,b,c;  Edge (int a1=0,int b1=0,int c1=0):a(a1),b(b1),c(c1){}  bool operator < (const Edge& chs)const{return c<chs.c;}}theEdge[NN_MAX*NN_MAX];/**********************************************************/int matx[NN_MAX][NN_MAX],p[NN_MAX*NN_MAX];int lenEdge,ans;/**********************************************************/int min_2 (int x,int y) {return x<y?x:y;}int max_2 (int x,int y) {return x>y?x:y;}void swap (int& a, int& b){a^=b;b^=a;a^=b;}int find (int i){return i==p[i]?i:p[i]=find(p[i]);}void kruskal ();/**********************************************************/int main(){  if (READ_FILE) freopen ("in.txt","r",stdin);  int n,q;  while (scanf ("%d",&n)!=EOF)  {for (int i=1;i<=n;i++)  for (int j=1;j<=n;j++)scanf ("%d",&matx[i][j]);scanf ("%d",&q);int a,b;for (int i=0;i<q;i++){  scanf ("%d %d",&a,&b);  matx[a][b]=matx[b][a]=0;}lenEdge=0;for (int i=1;i<=n;i++)  for (int j=i+1;j<=n;j++)theEdge[lenEdge++]=Edge(i,j,matx[i][j]);ans=0;for (int i=0;i<=n;i++) p[i]=i;kruskal ();printf ("%d\n",ans);  }  return 0;}void kruskal (){  sort (theEdge,theEdge+lenEdge);   for (int i=0;i<lenEdge;i++){int x=find(theEdge[i].a), y=find(theEdge[i].b);if (x!=y){  ans+=theEdge[i].c;  p[x]=y;}  } }


0 0