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; }
相关文章推荐
- hdu 1598 find the most comfortable road 枚举+最小成生树 kruskal 解题报告
- HDU 4252 A Famous City 解题报告
- 最大报销额 (HDU 1864)解题报告(DP - 01 - 背包)
- HDU-1422 重温世界杯 ACM解题报告(贪心)
- HDU 4569 Special equations 解题报告
- HDU 1465 解题报告
- hdu 2000 ASCII码排序解题报告
- hdu 3074 Multiply game(线段树模板题) 解题报告
- HDU 3663 Power Stations 解题报告(Dancing Link)
- 10年 成都regional A题 HDU 3709解题报告
- HDU 4734 数位DP 解题报告
- HDU 4711 Weather 解题报告
- HDU 4770 Lights Against Dudely 解题报告
- HDU 2855解题报告
- HDU 2276解题报告
- hdu 1272 小希的迷宫 解题报告
- hdu 1879 继续畅通工程 解题报告
- HDU 4722 Good Numbers 解题报告
- HDU杭电2013 多校第一场解题报告
- Hdu 2053 Switch Game 推结论? 找规律?解题报告