hdu 1598
//暴力+并查集
#include<stdio.h>
#include<stdlib.h>
#define N 300
#define inf 0x7fffffff
struct node {
int x,y,spee;
}map[N*4];
int pre[N];
int find(int n) {
if(n!=pre[n])
pre[n]=find(pre[n]);
return pre[n];
}
int cmp(const void *a,const void*b) {//排序
return (*(struct node *)a).spee>(*(struct node *)b).spee?1:-1;
}
int main() {
int n,m,i,j,k,f1,f2,cnt,start,end;
while(scanf("%d%d",&n,&m)!=EOF) {
for(i=0;i<m;i++)
scanf("%d%d%d",&map[i].x,&map[i].y,&map[i].spee);
qsort(map,m,sizeof(map[0]),cmp);//排序
scanf("%d",&k);
while(k--) {
scanf("%d%d",&start,&end);
cnt=inf;
for(i=0;i<m;i++) {//暴力枚举,不断缩小,枚举所有可以连通的情况,求出最小的速度差;
for(j=1;j<=n;j++)
pre[j]=j;
for(j=i;j<m;j++) {//如果
f1=find(map[j].x);
f2=find(map[j].y);
pre[f2]=f1;
if(find(start)==find(end)) {//说明前j个元素就可以使其连通,就是要找到最小的速度i,因为第j个就是最大的速度。缩小最小速度的范围;
if(cnt>map[j].spee-map[i].spee)//如果已连通求出最小的速度差
cnt=map[j].spee-map[i].spee;
break;
}
}
if(j==m)//枚举到没有答案满足两点连通就结束
break;
}
if(cnt<inf)
printf("%d\n",cnt);
else
printf("-1\n");
}
}
return 0;
}
#include<stdio.h>
#include<stdlib.h>
#define N 300
#define inf 0x7fffffff
struct node {
int x,y,spee;
}map[N*4];
int pre[N];
int find(int n) {
if(n!=pre[n])
pre[n]=find(pre[n]);
return pre[n];
}
int cmp(const void *a,const void*b) {//排序
return (*(struct node *)a).spee>(*(struct node *)b).spee?1:-1;
}
int main() {
int n,m,i,j,k,f1,f2,cnt,start,end;
while(scanf("%d%d",&n,&m)!=EOF) {
for(i=0;i<m;i++)
scanf("%d%d%d",&map[i].x,&map[i].y,&map[i].spee);
qsort(map,m,sizeof(map[0]),cmp);//排序
scanf("%d",&k);
while(k--) {
scanf("%d%d",&start,&end);
cnt=inf;
for(i=0;i<m;i++) {//暴力枚举,不断缩小,枚举所有可以连通的情况,求出最小的速度差;
for(j=1;j<=n;j++)
pre[j]=j;
for(j=i;j<m;j++) {//如果
f1=find(map[j].x);
f2=find(map[j].y);
pre[f2]=f1;
if(find(start)==find(end)) {//说明前j个元素就可以使其连通,就是要找到最小的速度i,因为第j个就是最大的速度。缩小最小速度的范围;
if(cnt>map[j].spee-map[i].spee)//如果已连通求出最小的速度差
cnt=map[j].spee-map[i].spee;
break;
}
}
if(j==m)//枚举到没有答案满足两点连通就结束
break;
}
if(cnt<inf)
printf("%d\n",cnt);
else
printf("-1\n");
}
}
return 0;
}