- #include <stdio.h>
- #include <string.h>
- #include <algorithm>
- typedef struct
- {
- int u;
- int v;
- int w;
- }edge;
- typedef struct ufset
- {
- int *parent;
- }ufset,*UFSet;
- UFSet Init(int N)
- {
- UFSet U=new ufset[N+1];
- U->parent=new int[N+1];
- memset(U->parent,-1,sizeof(int)*(N+1));
- return U;
- }
- int Find(UFSet U,int e)
- {
- int eParent=e;
- while(U->parent[eParent]>=0)
- eParent=U->parent[eParent];
- int temp;
- while(e!=eParent)
- {
- temp=U->parent[e];
- U->parent[e]=eParent;
- e=temp;
- }
- return eParent;
- }
- void Union(UFSet U,int p1,int p2)
- {
- if(U->parent[p1]<U->parent[p2])
- {
- U->parent[p1]+=U->parent[p2];
- U->parent[p2]=p1;
- }
- else
- {
- U->parent[p2]+=U->parent[p1];
- U->parent[p1]=p2;
- }
- }
- int cmp(const void *p1,const void *p2)
- {
- return ((edge *)p1)->w - ((edge *)p2)->w;
- }
- void Kruskal(UFSet U,edge e[],int N,int M)
- {
- int max=-1;
- int i;
- qsort(e+1,M,sizeof(edge),cmp);
- for(i=1;i<=M;i++)
- {
- int p1=Find(U,e[i].u);
- int p2=Find(U,e[i].v);
- if(p1!=p2)
- {
- Union(U,p1,p2);
- if(max<e[i].w)
- max=e[i].w;
- }
- }
- printf("%d/n",max);
- }
- int main()
- {
- int N,M;
- int i;
- while(scanf("%d%d",&N,&M)!=EOF)
- {
- UFSet U=Init(N);
- edge *e=new edge[M+1];
- for(i=1;i<=M;i++)
- scanf("%d%d%d",&e[i].u,&e[i].v,&e[i].w);
- Kruskal(U,e,N,M);
- delete U->parent;
- delete U;
- delete e;
- }
- return 0;
- }
- /*
- WA了这么多次也该总结一下:
- problem 1: 不会用c来编程,scanf(...!=EOF)是我总是出错的最大原因,哎,总是C++
- 编程,忽略了C里的一些用法和技巧
- problem 2: 学会ACM方法 scanf() printf(),not cin cout ;
- 学会一次直接分配数组(必要时或大多数时全局),而不要去用new delete
- 动态分配固然好,但速度慢;
- */
- /*
- 标准ACM:
- #include <stdio.h>
- #include <string.h>
- #include <algorithm>
- typedef struct
- {
- int u;
- int v;
- int w;
- }edge;
- edge e[10005];
- int parent[2005];
- int Find(int e)
- {
- int eP=e;
- while(parent[eP]>=0)
- eP=parent[eP];
- int temp;
- while(e!=eP)
- {
- temp=parent[e];
- parent[e]=eP;
- e=temp;
- }
- return eP;
- }
- void Union(int p1,int p2)
- {
- if(parent[p1]<parent[p2])
- {
- parent[p1]+=parent[p2];
- parent[p2]=p1;
- }
- else
- {
- parent[p2]+=parent[p1];
- parent[p1]=p2;
- }
- }
- int cmp(const void *p1,const void *p2)
- {
- return ((edge *)p1)->w - ((edge *)p2)->w;
- }
- void KruskalMinTree(int N,int M)
- {
- int max=-1;
- int i;
- int j=0;
- qsort(e+1,M,sizeof(edge),cmp);
- for(i=1;i<=M;i++)
- {
- int p1=Find(e[i].u);
- int p2=Find(e[i].v);
- if(p1!=p2)
- {
- Union(p1,p2);
- if(max<e[i].w)
- max=e[i].w;
- j++;
- }
- if(j>=N-1)
- break;
- }
- printf("%d/n",max);
- }
- int main()
- {
- int N,M;
- int i;
- while(scanf("%d%d",&N,&M)!=EOF)
- {
- memset(parent,-1,sizeof(int)*(N+1));
- for(i=1;i<=M;i++)
- scanf("%d%d%d",&e[i].u,&e[i].v,&e[i].w);
- KruskalMinTree(N,M);
- }
- return 0;
- }
- */
pku 2395
最新推荐文章于 2022-02-25 19:38:17 发布