您的位置:首页 > 其它

hdu 1598 find the most comfortable road

2011-11-23 23:43 246 查看
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;
}


  
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: