#include<stdio.h> #include<stdlib.h> #define Confi double//set Confidence as double #define Vertex int//set Vertex as int #define Weight double//set Weight as double struct Edge{//one edge has three properties-two vertexes and the weight Vertex V1; Vertex V2; Weight W; }; struct Component{//one Component has three properties int Num;//Num stands for the (-size) when it's the root, else it points to its fahter Weight MaxEdge;//its maximum edge weight of the minimum spanning tree Confi H;//its Confidence }; Confi Min(Confi H1,Confi H2){//to find the smaller Confidence if (H1>H2) return H2; else return H1; } Vertex FindRoot(Vertex V,struct Component C[]){//the find a Vertex's root if(C[V].Num<0) return V; //found else { C[V].Num=FindRoot(C[V].Num,C);//path compression return C[V].Num; } } int main(){ int Nv=0,Ne=0;double c=0; printf("Please enter the total number of vertices, the total number of edges and the constant in the function f(C).\n"); scanf("%d %d %lf",&Nv,&Ne,&c);//to get three parameters struct Edge E[Ne]; int i=0;int j=0; for(i=0;i<Ne;i++) scanf("%d %d %lf",&E[i].V1,&E[i].V2,&E[i].W);//to get the Edge printf("Please enter the edge in the format of 'V1 V2 Weight'.\n"); struct Edge temp;//order Edge in a non-decreasing sequence for(i=1;i<Ne;i++) for(j=0;j<Ne-i;j++) if(E[j].W>E[j+1].W) { temp= E[j]; E[j]=E[j+1]; E[j+1]=temp; } struct Component C[Nv];//initialize the Component(at first, every vertex is a component) for(i=0;i<Nv;i++){ C[i].Num=-1;//every conponent has one vertex C[i].MaxEdge=0;//its maximum edge weight of the minimum spanning tree is 0 C[i].H=c;//its confidence equals to c } int Root1,Root2;int RootMin,RootMax; for(i=0;i<Ne;i++){ Root1=FindRoot(E[i].V1,C);//to find one root Root2=FindRoot(E[i].V2,C);//to find another root if((Root1!=Root2)&&(E[i].W<=Min(C[Root1].H,C[Root2].H))){ //if the root is different&& //the weight is no larger than the smaller confidence of the two components if(Root1>Root2){//to get the smaller root and the larger root RootMin=Root2;RootMax=Root1; } else{ RootMin=Root1;RootMax=Root2; } C[RootMin].MaxEdge=E[i].W;//renew the maximum edge weight of the minimum spanning tree C[RootMin].Num=C[RootMin].Num+C[RootMax].Num;//renew the size of the component C[RootMin].H=C[RootMin].MaxEdge+(-c)/C[RootMin].Num;//renew the confidence C[RootMax].Num=RootMin;//the larger root points to the new root }} Vertex Root[Nv];//create the root array for(i=0;i<Nv;i++) Root[i]=FindRoot(i,C);//the array value is the root for(i=0;i<Nv;i++){//begin to output from 0 if(Root[i]!=Nv){//if the vertex hasn't been outputed printf("%d",i);//we output it for(j=i+1;j<Nv;j++){//then to find the vertex which has the same root if(Root[j]==Root[i]){//if the root is the same Root[j]=Nv;//we change its root into Nv printf(" %d",j);}//then we output it }printf("\n"); }} }