BZOJ1050 [HAOI2006]旅行
其实这道题根本不用最短路算法...
我们可以就把边从小到大排序,那么只需要枚举大小两个端点,把中间的边都加进去判断联通性即可.
判断联通性显然用的是并查集.
#include <cstdio>
#include <algorithm>
struct DJSET{
struct{
int fa,rk;
} p[505];
int find(int k){ return p[k].fa?p[k].fa=find(p[k].fa):k; }
inline void merge(int a,int b){
a=find(a),b=find(b);
if(a==b) return;
if(p[a].rk<p[b].rk) std::swap(a,b);
p[b].fa=a;
if(p[a].rk==p[b].rk) ++p[a].rk;
}
} set[5005];
struct eg{
int f,t,l;
inline void read(){
scanf("%d%d%d",&f,&t,&l);
}
} Es[5005];
int gcd(int a,int b){
if(a) return gcd(b%a,a);
return b;
}
bool cmp(const eg& a,const eg& b){
return a.l<b.l;
}
int m,n,i,j,s,t;
int FA,FB,FC,FA1,FB1,FC1;
inline void reduce(){
FC=gcd(FA,FB);
FA/=FC,FB/=FC;
}
int main(){
scanf("%d%d",&n,&m);
for(i=0;i<m;++i) Es[i].read();
std::sort(Es,Es+m,cmp);
scanf("%d%d",&s,&t);
FA1=1000;
for(i=0;i<m;++i){
for(j=i;j<m;++j){
set[i].merge(Es[j].f,Es[j].t);
if(set[i].find(s)==set[i].find(t)){
FA=Es[j].l,FB=Es[i].l;
reduce();
if(FA*FB1<FB*FA1){
FA1=FA;
FB1=FB;
}
break;
}
}
}
if(FB1==0) printf("IMPOSSIBLE"); else{
if(FB1==1) printf("%d\n",FA1); else printf("%d/%d\n",FA1,FB1);
}
return 0;
}
其实有个小优化:当所有边都加入而不联通时直接退出IMPOSSIBLE.
然后哎唷我擦快了不少...
#include <cstdio>
#include <algorithm>
struct DJSET{
struct{
int fa,rk;
} p[505];
int find(int k){ return p[k].fa?p[k].fa=find(p[k].fa):k; }
inline void merge(int a,int b){
a=find(a),b=find(b);
if(a==b) return;
if(p[a].rk<p[b].rk) std::swap(a,b);
p[b].fa=a;
if(p[a].rk==p[b].rk) ++p[a].rk;
}
} set[5005];
struct eg{
int f,t,l;
inline void read(){
scanf("%d%d%d",&f,&t,&l);
}
} Es[5005];
int gcd(int a,int b){
if(a) return gcd(b%a,a);
return b;
}
bool cmp(const eg& a,const eg& b){
return a.l<b.l;
}
int m,n,i,j,s,t;
int FA,FB,FC,FA1,FB1,FC1;
inline void reduce(){
FC=gcd(FA,FB);
FA/=FC,FB/=FC;
}
int main(){
scanf("%d%d",&n,&m);
for(i=0;i<m;++i) Es[i].read();
std::sort(Es,Es+m,cmp);
scanf("%d%d",&s,&t);
FA1=1000;
for(i=0;i<m;++i){
for(j=i;j<m;++j){
set[i].merge(Es[j].f,Es[j].t);
if(set[i].find(s)==set[i].find(t)){
FA=Es[j].l,FB=Es[i].l;
reduce();
if(FA*FB1<FB*FA1){
FA1=FA;
FB1=FB;
}
break;
}
}
if(FB1==0){
printf("IMPOSSIBLE\n");
return 0;
}
}
if(FB1==1) printf("%d\n",FA1); else printf("%d/%d\n",FA1,FB1);
return 0;
}
由于空间够大我还偷了个懒没有每次memset一遍...然后就出现了奇异的景象:
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
2W多KB的那个SB就是我.
BZOJ1050 [HAOI2006]旅行的更多相关文章
- BZOJ1050 HAOI2006旅行(最小生成树+LCT)
暴力枚举路径中权值最小边是哪个,然后求出边权不小于它的边的最小生成树,即可保证该路径上最大值最小.暴力当然可以过,这里使用LCT维护.注意数据中有自环. #include<iostream> ...
- bzoj1050: [HAOI2006]旅行comf
Description 给你一个无向图,N(N<=500)个顶点, M(M<=5000)条边,每条边有一个权值Vi(Vi<30000).给你两个顶点S和T,求一条路径,使得路径上最大 ...
- [BZOJ1050] [HAOI2006] 旅行comf (Kruskal, LCT)
Description 给你一个无向图,N(N<=500)个顶点, M(M<=5000)条边,每条边有一个权值Vi(Vi<30000).给你两个顶点S和T,求一条路径,使得路径上最大 ...
- bzoj1050[HAOI2006]旅行comf(枚举+贪心+并查集)
Description 给你一个无向图,N(N<=500)个顶点, M(M<=5000)条边,每条边有一个权值Vi(Vi<30000).给你两个顶点S和T,求一条路径,使得路径上最大 ...
- BZOJ1050: [HAOI2006]旅行comf(并查集 最小生成树)
Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 4021 Solved: 2257[Submit][Status][Discuss] Descript ...
- [BZOJ1050][HAOI2006]旅行comf 枚举+并查集
题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1050 将边排序,枚举边权最小的边,依次加边直到S和T连通,更新答案. #include&l ...
- [bzoj1050 HAOI2006] 旅行comf (kruskal)
传送门 Description 给你一个无向图,N(N<=500)个顶点, M(M<=5000)条边,每条边有一个权值Vi(Vi<30000).给你两个顶点S和T,求 一条路径,使得 ...
- BZOJ1050 [HAOI2006]旅行comf[并查集判图连通性]
★ Description 给你一个无向图,N(N<=500)个顶点, M(M<=5000)条边,每条边有一个权值Vi(Vi<30000).给你两个顶点S和T,求 一条路径,使得路径 ...
- 【BZOJ1050】[HAOI2006]旅行
[BZOJ1050][HAOI2006]旅行 题面 bzoj 洛谷 题解 先将所有边从小往大排序 枚举钦定一条最小边 再枚举依次枚举最大边,如果两个点联通了就\(break\)统计答案即可 代码 #i ...
随机推荐
- 【Moqui业务逻辑翻译系列】--UBPL index
h2. [UBPL Introduction] ubpl介绍h2. [Actor Definitions] 行为定义h2. General Business Process Stories 通常的商业 ...
- Daily Scrum – 1/19
Meeting Minutes 绑定了快捷键: 改良了user course: 修了一系列Bug: 准备进行演示 Progress part 组员 今日工作 Time (h) 明日计划 Time ...
- OC基础--成员变量的封装
一.封装的作用: 1.重用 2.不必关心具体的实现 3.面向对象三大特征之一 4.具有安全性 二.OC中成员变量的命名规范以及注意事项 1.命名规范--.成员变量都以下划线“_”开头 1)为了跟get ...
- JS所谓的享元模式-->
<!DOCTYPE html> <html> <head> <title></title> </head> <body&g ...
- jquery 在 table 中修改某行值
修改 table 中某行的的方法步骤如下: 1.选择要修改的行,事件触发,比如我的 双击某行时修改 2.将要修改的行,替换为input,原先的列中的值,需要放到对应的input中作为默认值 3.修改完 ...
- Mysql安全配置
相关学习资料 http://drops.wooyun.org/tips/2245 http://www.cnblogs.com/siqi/archive/2012/11/21/2780966.html ...
- ETHREAD APC 《寒江独钓》内核学习笔记(4)
继续学习windows 中和线程有关系的数据结构: ETHREAD.KTHREAD.TEB 1. 相关阅读材料 <windows 内核原理与实现> --- 潘爱民 2. 数据结构分析 我们 ...
- Type-Length-Value编码
Within data communication protocols, optional information may be encoded as a type-length-value or T ...
- Codeforces 548B Mike and Fun
传送门 B. Mike and Fun time limit per test 2 seconds memory limit per test 256 megabytes input standard ...
- MySQL中concat函数
MySQL中concat函数使用方法:CONCAT(str1,str2,…) 返回结果为连接参数产生的字符串.如有任何一个参数为NULL ,则返回值为 NULL. 注意:如果所有参数均为非二进制字符串 ...