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;
}
Esempio n. 3
0
void initGraph(GraphRef g){
makeWhite(g);
resetDist(g);
resetParent(g);
}