HDU-1598 find the most comfortable road(最小生成树 Prim)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1598

#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
#define N 210
#define M 1010
#define inf 0x3f3f3f3f
#define min(a,b) ((a)<(b)?(a):(b))
using namespace std;
int per[N],n,m,s,t;
int ans;
struct Edge {
	int s,e,speed;
} edge[M];
int cmp(Edge a,Edge b) {
	return a.speed <b.speed;
}
int find(int x) {
	while(x!=per[x]) x=per[x];
	return x;
}

int main() {
	while(scanf("%d%d",&n,&m)!=EOF) {
		int i,j;
		for(i=0; i<m; i++)
			scanf("%d%d%d",&edge[i].s,&edge[i].e,&edge[i].speed);
		sort(edge,edge+m,cmp);
		int q;
		scanf("%d",&q);
		while(q--) {
			scanf("%d%d",&s,&t);
			int minn=inf;
			for(i=0; i<m; i++) { //枚举
				for(j=1; j<=n; j++)
					per[j]=j;
				for(j=i; j<m; j++) {
					int fx=find(edge[j].s);
					int fy=find(edge[j].e );
					if(fx!=fy)
						per[fy]=fx;
					if(find(s)==find(t)) {
						minn=min(minn,edge[j].speed-edge[i].speed );
						break;
					}
				}
			}
			if(minn==inf)
				puts("-1");
			else printf("%d\n",minn);
		}
	}
}

猜你喜欢

转载自blog.csdn.net/qq_39564498/article/details/81812695
今日推荐