int main() { int a,b; int result=1; int i=0; int maxV=0; int t1,t2; resetParent(); while(1) { scanf("%d%d",&a,&b); if(-1 == a && -1 == b) { break; } else if(0==a && 0==b) { if(1 == result) { for (i=1;i<=maxV;++i) { if (getParent(i) != getParent(maxV)) { result=0; break; } } } if(1 == result) { puts("Yes"); } else { puts("No"); } result=1; resetParent(); } else if(1 == result) { if(maxV < a)maxV=a; if(maxV < b)maxV=b; parent[a]=getParent(a); parent[b]=getParent(b); if(parent[a]==parent[b]) { result=0; } else { parent[parent[b]]=parent[a]; } } } return 0; }
int kruskal()//克鲁斯卡尔求最小生成树算法 { int i; int minCost=0;//最小花费 int a,b; resetParent(26); qsort(graph,gIndex,sizeof(Graph),cmp); for(i=0; i<gIndex;++i) { a=graph[i].va; b=graph[i].vb; parent[a]=getRoot(a); parent[b]=getRoot(b); /*如果该边所依附的两个结点不在同一棵树中, 则将该边加入最小生成树中。 */ if(parent[a] != parent[b]) { minCost += graph[i].cost; parent[parent[a]] = parent[b]; } } return minCost; }
void initGraph(GraphRef g){ makeWhite(g); resetDist(g); resetParent(g); }