hdu 1598 find the most comfortable road
http://acm.hdu.edu.cn/showproblem.php?pid=1598
才开始是我看着没什么思路,心想就用dfs暴搜试试吧(本人太爱dfs了)。结果加了各种剪枝都都是TLE无语。。最后听von说用并查集,给我讲了讲才明白,不过开始的时候把边的最大值开成点的最大值了贡献了4次wa才检查出来。。无语了,自己太马虎了。。
思路:先将各个边按限速排序,然后从最大的开始里循环用并查集建树,直到起点与终点的父亲相同说明此事s与e已经建立联系,然后用开始循环的节点的速度(该路线上的最大速速)减去最后将s,e连接的边的速度就是该路径上的Vmax-Vmin的最小了。。
#include <iostream>
#include <cstdio>
#include <cstdlib>
using namespace std;
const int max_s = 1007;
int f[207];
struct node
{
int a,b,w;
}p[max_s];
int n;
int cmp(const void *a,const void *b)
{
return (*(node*)b).w-(*(node*)a).w;
}
void init()
{
for(int i=0;i<=n;i++)
f[i]=i;
}
int find(int a)
{
if(f[a]!=a)
f[a]=find(f[a]);
return f[a];
}
void Union(int a,int b)
{
int x=find(a);
int y=find(b);
if(x!=y)
f[y]=x;
}
int main()
{
//freopen("d.txt","r",stdin);
int m,i,j,op;
while(~scanf("%d%d",&n,&m))
{
for(i=0;i<m;i++)
scanf("%d%d%d",&p[i].a,&p[i].b,&p[i].w);
qsort(p,m,sizeof(p[0]),cmp);
scanf("%d",&op);
while(op--)
{
int s,e;
scanf("%d%d",&s,&e);
int min=9999999;
for(i=0;i<m;i++)
{
init();
for(j=i;j<m;j++)
{
Union(p[j].a,p[j].b);
if(find(s)==find(e))
{
if(min>p[i].w-p[j].w)
min=p[i].w-p[j].w;
break;
}
}
}
if(min!=9999999)
printf("%d\n",min);
else
printf("-1\n");
}
}
return 0;
}


浙公网安备 33010602011771号