poj3522

非常坑的一题,Kruskal+贪心+枚举

学长推荐的基础题,累觉不爱了-_-||

wa了不明觉厉

#include<iostream>
#include<algorithm>
#include<stdlib.h>
#include<string.h>
#include<string>
#include<vector>
#include<queue>
#include<list>
using namespace std;
typedef long long lld;
typedef unsigned int ud;
#define Inf INT_MAX//int最大
#define Min(x,y) (x)<(y)?(x):(y)
#define Max(x,y) (x)>(y)?(x):(y)
#define PQ priority_queue
#define Q queue
#define N 102
struct Node
{
	int u,v;
	int w;
}edge[N*(N-1)/2];
int parent[N*(N-1)/2];
int n,m;

void InitParent()
{
	for(int i=1;i<=n;i++)
		parent[i]=-1;
}

int find(int x)
{
	return parent[x]<0 ? x : parent[x];
}

void merge(int r1,int r2)
{
	
	if(parent[r1]>parent[r2])
		parent[r1]=r2;
	else
		parent[r2]=r1;
}

int MyKruskal(int s)
{
	int max,min=edge[s].w;
	InitParent();
	int k=0;
	for(int i=s;i<=m;i++)
	{
		int u=find(edge[i].u);
		int v=find(edge[i].v);
		if(u!=v)
		{
			//merge(u,v);
			parent[u]=v;
			if(++k==n-1)
			{
				max=edge[i].w;
				break;
			}
		}
	}
	if(k!=n-1)
		return -1;
	return max-min;
}

bool cmp(Node n1,Node n2)
{
	return n1.w<n2.w;
}

int main()
{
	while(scanf("%d%d",&n,&m)&&(n||m))
	{
		for(int i=1;i<=m;i++)
			scanf("%d%d%d",&edge[i].u,&edge[i].v,&edge[i].w);
		
		sort(edge+1,edge+1+m,cmp);
		int ans=MyKruskal(1);
		if(ans<0)
		{
			//printf("结果:");
			printf("-1\n");
			continue;
		}
		for(int i=2;i<=m;i++)
		{
			int res=MyKruskal(i);
			if(res<0)
				continue;
			if(res<ans)
				ans=res;
		}
		//printf("结果:");
		printf("%d\n",ans);
	}
	return 0;
}

你可能感兴趣的:(算法,poj,kruskal)