HDU 1598 find the most comfortable road
2016-07-23 19:17
239 查看
题意:
给你n<=200个点m<=1000条道路的无向图,每条道路有一个时速,有q<=10个询问,问你从s到e的路径中min(最大时速-最小时速)。
思路:
先将边从小到大排,然后枚举每一条边作为起始边,然后去枚举比它大的边,用并查集不断维护这个图,直到s和e都加入后比较ans和(最后一条加入的边-起始边)。
给你n<=200个点m<=1000条道路的无向图,每条道路有一个时速,有q<=10个询问,问你从s到e的路径中min(最大时速-最小时速)。
思路:
先将边从小到大排,然后枚举每一条边作为起始边,然后去枚举比它大的边,用并查集不断维护这个图,直到s和e都加入后比较ans和(最后一条加入的边-起始边)。
#include<cstdio> #include<algorithm> using namespace std; const int INF=0x3f3f3f3f; const int MAXN=205; const int MAXM=1005; struct Edge{ int u,v,w; }edge[MAXM]; int n,m,q,fa[MAXN]; bool cmp(Edge a,Edge b){ return a.w<b.w; } void init(){ for(int i=1;i<=n;i++){ fa[i]=i; } } int Find(int x){ int r=x,t; while(r!=fa[r]){ r=fa[r]; } while(x!=r){ t=fa[x]; fa[x]=r; x=t; } return r; } void Union(int u,int v){ int a=Find(u); int b=Find(v); if(fa[a]!=b){ fa[a]=b; } } int main(){ while(~scanf("%d%d",&n,&m)){ for(int i=1;i<=m;i++){ scanf("%d%d%d",&edge[i].u,&edge[i].v,&edge[i].w); } sort(edge+1,edge+1+m,cmp); scanf("%d",&q); while(q--){ int s,e,ans=INF; scanf("%d%d",&s,&e); for(int i=1;i<=m;i++){ init(); for(int j=i;j<=m;j++){ Union(edge[j].u,edge[j].v); if(Find(s)==Find(e)){ ans=min(ans,edge[j].w-edge[i].w); } } } if(ans!=INF) printf("%d\n",ans); else printf("-1\n"); } } return 0; }
相关文章推荐
- HDU - 5319 Painter
- 单链表的建立
- Android Retrofit使用(一)
- java中对列表的添加或删除操作
- 实现QQ空间中显示照片效果
- C++基础:文件读写
- 使用Python抓取美团数据存于Excel中
- 经典排序算法3:堆排序
- Git用户手册--自定义 Git
- hdu-1052Tian Ji -- The Horse Racing(贪心,dp)
- 数据结构笔记--haffman树与haffman编码分析
- Valgrind简单用法
- 20160723
- HDU 1711 Number Sequence kmp算法
- java-并发-ConcurrentHashMap高并发机制-jdk1.6
- 结合开发文档分析volley(一)
- 菜鸟的android之路——活动相关
- Git用户手册--Git 工具
- 数据结构笔记--通过与BF算法的比较理解KMP算法
- http://127.0.0.1/thinkphp5/public/index/teacher/delete/id/1.html 这样的URL下,页面收不到get参数