poj2485--Kruskal

每天进步一点点~

poj2485

昨天写了Prim的题目,今天写Kruskal的题,有一点点的体悟,但还是不明显。

此题的题意主要是找到最小生成树中的最大边。

今天纠结这个题好久。。
第一次写Kruskal的题目,模仿了别人的代码,RunTimeError好多回。。。。
最后绝望之下将MAXN从500+10改成5000+10竟然就过了。。后来一检查才发现是我题意理解有点问题。。不过过了总是很开心啦~
还有我恋爱了~
今天给她做明信片了,纯手工噢~

还有,如果代码要在本地运行的话要将前面的

#define LOCAL

删掉。。

#define LOCAL
#include <stdio.h>
#include <string.h>
#include <stdlib.h> 

#define MAXN 500 + 10

typedef struct Edge
{
	int village1;
	int village2;
	int length;
};

int d[MAXN * MAXN];
Edge edge[MAXN * MAXN];

int cmp(const void *a, const void *b)
{
	return ((Edge *) a)-> length > ((Edge *) b)->length ? 1 : -1;
}

int find(int temp)
{
	while(temp != d[temp])
		temp = d[temp];
	return temp;
}


int main()
{
#ifdef LOCAL
	freopen("C:\\Users\\Administrator\\Desktop\\ACMTempIn.txt", "r", stdin);
	freopen("C:\\Users\\Administrator\\Desktop\\ACMTempOut.txt", "w", stdout);
#endif

	int cases;
	int i,j,size,k,p,q,min;
	scanf("%d/n", &cases);
	memset(edge, 0, sizeof(edge));

	while(cases--)
	{
		memset(d, 0 ,sizeof(d));
		scanf("%d/n", &size);
		//数据输入
		k = 0;
		for(i = 0; i < size; i++)
		{
			for(j = 0; j < size; j++)
			{
				scanf("%d", &edge[k].length);
					edge[k].village1 = i;
					edge[k].village2 = j;
					k++;
			}
		}
		//将边集进行排序
		qsort(edge, k, sizeof(Edge), cmp);
		//初始化
		for(i = 1; i < size; i++)
			d[i] = i;
		min = 0;
		for(i = 0; i < k; i++)
		{
			p = find(edge[i].village1);
			q = find(edge[i].village2);
			if(p != q)
			{
				if(edge[i].length > min)
					min = edge[i].length;
				d[q] = p;
			}
		}
		
		printf("%d\n", min);
	}

	return 0;
}





你可能感兴趣的:(c,struct)