BZOJ 1050 [HAOI2006]旅行comf
2016-09-25 13:35
218 查看
排序+贪心
按边权排序,枚举权值最小边,贪心地从小到大选取比最小边大的边,用并查集维护连通性
按边权排序,枚举权值最小边,贪心地从小到大选取比最小边大的边,用并查集维护连通性
#include<cstdio> #include<algorithm> #define M 5005 #define N 505 using namespace std; struct edge{int a,b,v;}e[M]; const int INF=30005; int fa ; bool cmp(edge a, edge b){return a.v<b.v;} int find(int x){return fa[x]==x?x:fa[x]=find(fa[x]);} int gcd(int a, int b){return b?gcd(b,a%b):a;} int main() { int n, m, s, t; int ans1=INF,ans2=1; scanf("%d%d",&n,&m); for(int i = 1; i <= m; i++) scanf("%d%d%d",&e[i].a,&e[i].b,&e[i].v); scanf("%d%d",&s,&t); sort(e+1,e+1+m,cmp); for(int i = 1; i <= m; i++) { for(int j = 1; j <= n; j++) fa[j]=j; for(int j = i; j <= m; j++) { int f1=find(e[j].a), f2=find(e[j].b); if(f1!=f2) fa[f1]=f2; if(find(s)==find(t)) if(e[j].v*ans2<1.0*ans1*e[i].v) ans1=e[j].v, ans2=e[i].v; } } if(ans1==INF)printf("IMPOSSIBLE\n"); else { int g=gcd(ans1,ans2); ans1/=g; ans2/=g; if(ans2==1)printf("%d\n",ans1); else printf("%d/%d\n",ans1,ans2); } }
相关文章推荐
- bzoj1050: [HAOI2006]旅行comf
- BZOJ 1050: [HAOI2006]旅行comf
- [bzoj1050] [HAOI2006]旅行comf
- BZOJ 1050: [HAOI2006]旅行comf 并查集
- bzoj 1050: [HAOI2006]旅行comf 并查集
- 【BZOJ 1050】1050: [HAOI2006]旅行comf (动态SPFA)
- BZOJ1050 [HAOI2006]旅行comf(Kruskal算法)
- [BZOJ]1050 旅行comf(HAOI2006)
- BZOJ 1050 [HAOI2006]旅行comf
- bzoj 1050: [HAOI2006]旅行comf 并查集
- [BZOJ1050][HAOI2006]旅行comf(并查集)
- [BZOJ1050][HAOI2006]旅行comf(并查集)
- [bzoj1050][HAOI2006]旅行comf【MST】
- 【BZOJ】【1050】【HAOI2006】旅行comf
- BZOJ 1050: [HAOI2006]旅行comf (并查集 或 单调队列)
- 【BZOJ 1050】 [HAOI2006]旅行comf
- [BZOJ1050][HAOI2006]旅行comf(图论)
- BZOJ 1050 [HAOI2006]旅行comf CODEVS 1001 舒适的路线 并查集
- BZOJ1050 [HAOI2006]旅行comf
- bzoj 1050: [HAOI2006]旅行comf