您的位置:首页 > 其它

hdu 1598 解题报告

2011-11-25 22:59 183 查看
说实话,一看到这个题,我第一反应就是dfs,本来想用dfs搜索每一个可行的路径,然后记录每一个可行路径上的最小速度差,然后再找出最小。可是写着写着就写不下去了,因为记录路径实在不会。在网上看别人的方法,才恍然大悟,原来并查集是可以的。好一个经典的算法啊。

思路:就是先按速度由小到大排序,然后在合并不在一个集合的元素,并检查起始点是否在一个集合里,如果已经在一个集合里了,那么用这时的速度减去开始合并进来的那个速度,则这个值就是所要求解的值,当然还有没有找到的情况,这个很好考虑了就

#include<stdio.h>
#include<string.h>
#include<iostream>
#include<algorithm>
using namespace std;
#define inf 999999999
#define N 250
int a
;
int n,m;
struct node
{
int x,y,dis;
}f[1010];
int cmp(node c,node d)
{
return c.dis<d.dis;
}
int find(int x)
{
if(a[x]!=x)
return a[x]=find(a[x]);
return a[x];
}
int main()
{
int i,j;
int h;
while(cin>>n>>m)
{
for(i=0;i<m;i++)
cin>>f[i].x>>f[i].y>>f[i].dis;
sort(f,f+m,cmp);
int q,s,e;
cin>>q;
while(q--)
{
cin>>s>>e;
int k=inf,ans;
for(i=0;i<m;i++)
{
for(h=1;h<=n;h++)
a[h]=h;
for(j=i;j<m;j++)
{
int root1=find(f[j].x);
int root2=find(f[j].y);
if(root1!=root2) a[root1]=root2;
if(find(s)==find(e))
{
ans=f[j].dis-f[i].dis;
if(ans<k) k=ans;
break;
}

}
if(j==m) break;
}
if(k!=inf) cout<<k<<endl;
else cout<<"-1"<<endl;
}
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: