[并查集]最优路线
来源:互联网 发布:游戏书籍 知乎 编辑:程序博客网 时间:2024/06/10 11:12
题目大意:
给定一个n点m边的无向图,一个起点s,一个终点t
请你找一条从s到t的路径,保证路径上边的最大权值与最小权值的比值最小
如果有,输出比值,否则输出"IMPOSSIBLE"
n <= 5000, m <= 100000, 1 <= u, v <= n, 1 <= w <= 100000
solution:
O(m2)的枚举很好想到 ..
O(mlogm):
1.按边权值排序,标号1~m
2.初始化一个枚举起点o=1
3.初始化并查集
4.从o开始顺推,用并查集加边,直到s与t连通
5.记录当前边编号为r
6.初始化并查集
7.从r逆推,利用并查集加边,直到s与t连通
8.得到当前边编号,记为l
9.[l,r]是一组比较优的可行解,更新答案
10.枚举起点o变为l+1,返回第3步继续执行
#include<iostream>#include<cstdio>#include<algorithm>using namespace std;int m,n,s,t;int f[5010],L=1,R;int u[100010],v[100010],w[100010];int r[100010];inline bool cmp(const int i,const int j){return w[i]<w[j];}inline int find(int x){return f[x]==x?x:f[x]=find(f[x]);}inline int gcd(int a,int b){ if(b==0)return a; else return gcd(b,a%b);}inline bool check(int x){ int i; for(i=1;i<=n;++i)f[i]=i; for(i=x;i<=m;++i) { int e=r[i]; int x=find(u[e]); int y=find(v[e]); f[x]=y; if(find(s)==find(t)) { R=i; return true; } } return false;}inline bool check_2(int x){ int i; for(i=1;i<=n;++i)f[i]=i; for(i=x;i>=1;--i) { int e=r[i]; int x=find(u[e]); int y=find(v[e]); f[x]=y; if(find(s)==find(t)) { L=i; return true; } } return false;}void work(){ int a=0,b=0; double ans=999999999; while(L<=m) { if(!check(L)) { L++; continue; } check_2(R); if(((double)w[r[R]]/(double)w[r[L]])<ans) { ans=((double)w[r[R]]/(double)w[r[L]]); b=w[r[L]]; a=w[r[R]]; } L++; } if(a==0) { printf("IMPOSSIBLE"); return; } else { if(a%b==0) { printf("%d",a/b); return; } int p=gcd(a,b); a/=p; b/=p; printf("%d/%d",a,b); return; }}int main(){ scanf("%d %d",&n,&m); scanf("%d %d",&s,&t); for(int i=1;i<=m;++i) scanf("%d %d %d",&u[i],&v[i],&w[i]); for(int i=1;i<=m;++i)r[i]=i; sort(r+1,r+m+1,cmp); work(); return 0;}
- [并查集]最优路线
- 并查集-201412-4 最优灌溉
- 最优生成树 并查集和贪心的运用
- 51NOD 1821 最优集合 【并查集】
- 51nod 1821 最优集合(想法+贪心+并查集)
- 51nod 1821 最优集合 并查集 || 栈
- 51nod 1821 最优集合(贪心+并查集)
- codevs 1231 最优布线问题 并查集 解题报告
- NYOJ 711 最舒适的路线(并查集)
- nyoj711最舒适的路线 (枚举 + 并查集 )
- codevs 1001 舒适的路线(并查集)
- codevs 1001 舒适的路线(并查集+贪心)
- 并查集—1001 舒适的路线题解
- bzoj 1050 codevs1001 舒适的路线[并查集]
- codevs1001 舒适的路线 贪心枚举+并查集
- codevs 1001 舒适的路线(并查集) 题解
- NYOJ_711_最舒适的路线【并查集】
- codevs 1001 舒适的路线 并查集
- sql规范告诫 解决兼容性问题 经验记录
- 面试题37:两个链表的第一个公共结点
- 类:加载、继承、多态(day04-13.10.16)
- Oracle GoldenGate 11gR2 Configuration On Oracle Database 11gR2 RAC ACFS
- 修正下载时错乱文件名小工具
- [并查集]最优路线
- Deep Learning(深度学习)学习笔记整理系列之(三)
- Documentation/pcmcia/devicetable
- 《新概念51单片机C语言教程 入门、提高、开发、拓展全攻略》
- C语言截取字符串的例子
- maven快速搭建
- Spring注解
- javascript刷新页面 js刷新页面
- linux的mount(挂载)命令详解