SSL 1312 2461 洛谷 2502 旅行
2018-03-31 14:11
357 查看
题目
选择行使过程中最大速度和最小速度的比尽可能小的路线分析
运用Kruskal,首先枚举一条边,然后找一个最小生成树。代码
#include <cstdio> #include <cctype> #include <algorithm> using namespace std; struct node{int x,y,w;}e[5001]; bool flag; int n,m,f[501],st,a,b,en,nod; double mn=2147483647; int in(){ int ans=0; char c=getchar(); while (!isdigit(c)) c=getchar(); while (isdigit(c)) ans=ans*10+c-48,c=getchar(); return ans; } int getf(int u){return (f[u]==u)?u:f[u]=getf(f[u]);} bool cmp(node x,node y){return x.w<y.w;} void tn(int &a,int &b){a=in();b=in();} int main(){ tn(n,m); for (int i=1;i<=m;i++) tn(e[i].x,e[i].y),e[i].w=in(); stable_sort(e+1,e+1+m,cmp); tn(st,en); for (int i=1;i<m;i++){ for (int j=1;j<=n;j++) f[j]=j; nod=i-1; flag=0; while (1){ if (getf(st)==getf(en)) {flag=1;break;}//连通就可以退出 if (nod>m) break; int k1=getf(e[++nod].x); int k2=getf(e[nod].y); if (k1!=k2) f[k1]=k2; } if (flag&&(double)e[nod].w/e[i].w<mn) mn=(double)e[nod].w/e[i].w,a=e[nod].w,b=e[i].w; } if (mn==2147483647) puts("IMPOSSIBLE"); else{ int gcd=__gcd(a,b);//求最小公倍数 printf("%d",a/gcd); if (a%b) printf("/%d",b/gcd); } return 0; }
相关文章推荐
- SSL 1312_旅行_并差集
- (ssl1312)P2502 2006河南省赛第一试 旅行
- SSL_1312 旅行
- 洛谷 P1081 开车旅行
- 洛谷1027 car的旅行路线
- SSL 1764 1682 洛谷 1546 USACO 3.1 Agri-Net 最短网络
- 洛谷——P1137 旅行计划
- 洛谷P2502 旅行 SSL_1226 (并查集)
- SSL-ZYC 旅行
- SSL 1411 洛谷 2085 信息学奥赛一本通 1370
- 洛谷 P1137 旅行计划
- 洛谷P1137 旅行计划
- 洛谷 1312 [NOIP2011] Mayan游戏 dfs+模拟
- 洛谷1522 牛的旅行
- DP【洛谷P2134】 百日旅行
- 洛谷_2449/SSL_1222 矩形
- 洛谷 1455 信息学奥赛一本通 1387 SSL 2347 搭配购买
- SSL 1313 洛谷 2341 POJ 2186 受欢迎的牛 Popular Cows
- 洛谷 P1137 旅行计划
- (ssl 1202 洛谷1434)滑雪(记忆化搜索)