- #include <stdio.h>
- #include <string.h>
- #include <algorithm>
- typedef struct
- {
- int u;
- int v;
- int w;
- }edge;
- edge e[124755];
- int parent[505];
- 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 i,int j)
- {
- int p1=Find(i);
- int p2=Find(j);
- if(p1==p2)
- return;
- 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(e[i].w>max)
- max=e[i].w;
- j++;
- }
- if(j>=N-1)
- break;
- }
- printf("%d/n",max);
- }
- int main()
- {
- int T;
- int N,Q;
- int p1,p2;
- int count=1;
- int i,j;
- int matrix[505][505];
- scanf("%d",&T);
- while(count<=T)
- {
- scanf("%d",&N);
- memset(parent,-1,sizeof(int)*(N+1));
- for(i=1;i<=N;i++)
- for(j=1;j<=N;j++)
- scanf("%d",&matrix[i][j]);
- int k=1;
- for(i=1;i<=N;i++)
- for(j=i+1;j<=N;j++)
- {
- e[k].u=i;
- e[k].v=j;
- e[k].w=matrix[i][j];
- k++;
- }
- KruskalMinTree(N,N*(N-1)/2);
- count++;
- }
- return 0;
- }
- //knowledge: the minimum cost spanning tree
- //Submit:提交两次。1次:AC
- // 2次:试了一下改进的代码,结果并无效率改进
- //Learned:进一步了解Kruskal算法
- //下面是prim:
- /*
- #include <stdio.h>
- #include <string.h>
- #include <algorithm>
- #define MAX 505
- #define INF 65538
- void prim(int matrix[][MAX],int N,int u)
- {
- int i,j,k;
- int min;
- int maxcost=0;
- int closest[MAX];
- int lowcost[MAX];
- for(i=1;i<=N;i++)
- {
- lowcost[i]=matrix[u][i];
- closest[i]=u;
- }
- for(i=2;i<=N;i++)
- {
- min=INF;
- for(j=1;j<=N;j++)
- if(lowcost[j] && lowcost[j]<min)
- {
- min=lowcost[j];
- k=j;
- }
- if(maxcost<min)
- maxcost=min;
- lowcost[k]=0;
- for(j=1;j<=N;j++)
- {
- if(lowcost[j] && lowcost[j]>matrix[k][j])
- {
- lowcost[j]=matrix[k][j];
- closest[j]=k;
- }
- }
- }
- printf("%d/n",maxcost);
- }
- int main()
- {
- int T,N;
- int count=1;
- int i,j;
- int matrix[MAX][MAX];
- scanf("%d",&T);
- while(count<=T)
- {
- scanf("%d",&N);
- for(i=1;i<=N;i++)
- for(j=1;j<=N;j++)
- scanf("%d",&matrix[i][j]);
- prim(matrix,N,1);
- count++;
- }
- return 0;
- }
- */
pku 2485
最新推荐文章于 2024-08-14 11:22:43 发布