HDU 1596
来源:互联网 发布:淘宝运营商二次放号 编辑:程序博客网 时间:2024/05/16 07:36
这题分类是分在最短路里面。。
结果我用最短路想了办法没有什么思路。。。
百度了一下。。发现是并查集。。。。
题意:找到一条边权差值最小的路。
输出边权差。
思路: 先把边按照边权排序。然后从第一条边开始加入并查集。
直到起点和终点同根为止。。求出边权差。
然后以第二条。。。。直到最后一条。。
贴上代码:
#include<stdio.h>#include<string.h>#include<iostream>#include<algorithm>#define INF 100000000using namespace std;struct aa{ int s; int e; int t;}a[1005];bool cmp(aa b,aa c){ return b.t<c.t;}int re[205];int h[205];int N;void init(){ for(int i=1;i<=N;i++) re[i]=i; memset(h,0,sizeof(h));}int fd(int x){ if(re[x]==x) return x; else return fd(re[x]);}void hb(int x,int y){ x=fd(x); y=fd(y); if(x==y) return ; else if(h[x]<h[y]) re[x]=y; else { re[y]=x; if(h[x]==h[y]) h[x]++; }}bool ch(int x,int y){ return (fd(x)==fd(y));}int main(){ int m; while(scanf("%d%d",&N,&m)!=EOF) { for(int i=0;i<m;i++) scanf("%d%d%d",&a[i].s,&a[i].e,&a[i].t); sort(a,a+m,cmp); int Q; scanf("%d",&Q); while(Q--) { int k=0; int zz=INF; int s,e; scanf("%d%d",&s,&e); for(int k=0;k<m;k++) { init(); for(int i=k;i<m;i++) { hb(a[i].s,a[i].e); if(ch(s,e)==1) { zz=min(zz,a[i].t-a[k].t); break; } } }if(zz!=INF) printf("%d\n",zz); else printf("-1\n"); } }}
0 0
- hdu 1596
- hdu 1596
- HDU 1596
- HDU 1596
- HDU 1596
- hdu 1596
- HDU 1596
- HDU 1596
- hdu 1596(SPFA)
- HDU-1596 FLOYD
- hdu 1596最短路
- hdu 1596 floyd算法
- HDU 1596 单源最短路径
- hdu(1596)
- hdu 1596 floyd
- HDU 1596 最短路
- hdu 1596 floyd
- hdu
- Ubuntu桌面操作快捷键 + 搭建c/c++编译环境----CDT插件
- sql xtype类型
- 怎样解决手机提示SD卡已损坏,可能需要重新格式化卡的问题
- Hibernate与Jpa的关系
- C基础总结
- HDU 1596
- 18B20温度传感器详解
- UIColor RGB颜色对照表
- Java 用HttpClient发送Cookie
- Android 滑动效果入门篇(二)—— Gallery
- Mysql存储过程修改定义者
- SAP 采购收货时与FICO科目的对应关系,关联点 Account Assignment Category
- 在安装驱动过程中发生的问题
- 经典语录