ssl1312Z&P2502-[HAOI2006]旅行【图论,并查集】
2018-03-23 19:12
323 查看
正题
题目链接:https://www.luogu.org/problemnew/show/P2502
大意
有n个旅游景点,m条路,每条路有个限速,要求求一个点到另一个点的最大速度和最小速度的比最小。输出这个比。解题思路
把边排序一遍,然后枚举起始边,并查集连续,知道两个点先连为止。然后求最大速度和最小速度。代码
#include<cstdio> #include<algorithm> using namespace std; int n,m,father[501],s,e,mm,sl,fa; double mins; struct line{ int x,y,w; }a[5001]; int find(int x) { if (x!=father[x]) return father[x]=find(father[x]); else return father[x]; }//找祖先 int unionn(int x,int y) { int fa=find(x),fb=find(y); if (fa<fb) { father[fb]=fa; } else father[fa]=fb; }//连接祖先 bool cmp(line x,line y) { return x.w<y.w; }//排序用 int main() { scanf("%d%d",&n,&mm); s=0; for (int i=1;i<=mm;i++) { m++; scanf("%d%d%d",&a[m].x,&a[m].y,&a[m].w); } scanf("%d%d",&s,&e); sort(a+1,a+1+m,cmp);//排序 mins=2147483647; for (int i=1;i<=m;i++)//枚举起始边 { for (int j=1;j<=n;j++) father[j]=j; int k=i; int flag=false; while(true) { if (k>m) break; unionn(a[k].x,a[k].y);//连接两点 if (find(s)==find(e))//如果两点相连 {flag=true;break;} k++; } if (flag) { if (double(a[k].w)/double(a[i].w)<mins) { mins=double(a[k].w)/double(a[i].w); sl=a[i].w; fa=a[k].w;//记录 } } } if (mins!=2147483647) { if (fa%sl==0) printf("%d",fa/sl); else printf("%d/%d",fa/__gcd(fa,sl),sl/__gcd(fa,sl)); } else printf("IMPOSSIBLE"); }
相关文章推荐
- [BZOJ1050][HAOI2006]旅行comf(并查集)
- BZOJ 1050: [HAOI2006]旅行comf (并查集 或 单调队列)
- 【BZOJ】1050 [HAOI2006]旅行comf 并查集
- BZOJ 1050: [HAOI2006]旅行comf 贪心,并查集
- bzoj 1050: [HAOI2006]旅行comf 并查集
- BZOJ 1050: [HAOI2006]旅行comf 并查集
- bzoj 1050: [HAOI2006]旅行comf(最小生成树+并查集)
- 【穷举+并查集】BZOJ1050(HAOI2006)[旅行comf]题解
- bzoj 1050: [HAOI2006]旅行comf【枚举+并查集】
- 【并查集】BZOJ1050 [HAOI2006]旅行comp
- P2502 [HAOI2006]旅行
- [并查集]BZOJ 1050——[HAOI2006]旅行comf
- BZOJ 1050 [HAOI2006]旅行comf CODEVS 1001 舒适的路线 并查集
- bzoj 1050: [HAOI2006]旅行comf 并查集
- 【bzoj1050】[HAOI2006]旅行comf 并查集
- 【BZOJ1050】[HAOI2006]旅行comf 并查集
- [BZOJ1050][HAOI2006]旅行comf(并查集)
- [BZOJ1050][HAOI2006]旅行comf(图论)
- [并查集]HAOI2006 旅行
- 【BZOJ】1050: [HAOI2006]旅行comf(暴力+并查集)