这题分类是分在最短路里面。。
结果我用最短路想了办法没有什么思路。。。
百度了一下。。发现是并查集。。。。
题意:找到一条边权差值最小的路。
输出边权差。
思路: 先把边按照边权排序。然后从第一条边开始加入并查集。
直到起点和终点同根为止。。求出边权差。
然后以第二条。。。。直到最后一条。。
贴上代码:
#include<stdio.h>
#include<string.h>
#include<iostream>
#include<algorithm>
#define INF 100000000
using namespace std;
struct aa{
int s;
int e;
int t;
}a[1005];
bool cmp(aa b,aa c)
{
return b.t<c.t;
}
int re[205];
int h[205];
int N;
void init()
{
for(int i=1;i<=N;i++)
re[i]=i;
memset(h,0,sizeof(h));
}
int fd(int x)
{
if(re[x]==x) return x;
else return fd(re[x]);
}
void hb(int x,int y)
{
x=fd(x);
y=fd(y);
if(x==y) return ;
else if(h[x]<h[y])
re[x]=y;
else
{
re[y]=x;
if(h[x]==h[y])
h[x]++;
}
}
bool ch(int x,int y)
{
return (fd(x)==fd(y));
}
int main()
{
int m;
while(scanf("%d%d",&N,&m)!=EOF)
{
for(int i=0;i<m;i++)
scanf("%d%d%d",&a[i].s,&a[i].e,&a[i].t);
sort(a,a+m,cmp);
int Q;
scanf("%d",&Q);
while(Q--)
{
int k=0;
int zz=INF;
int s,e;
scanf("%d%d",&s,&e);
for(int k=0;k<m;k++)
{ init();
for(int i=k;i<m;i++)
{
hb(a[i].s,a[i].e);
if(ch(s,e)==1)
{
zz=min(zz,a[i].t-a[k].t);
break;
}
}
}if(zz!=INF)
printf("%d\n",zz);
else printf("-1\n");
}
}
}