其实这道题根本不用最短路算法...

我们可以就把边从小到大排序,那么只需要枚举大小两个端点,把中间的边都加进去判断联通性即可.

判断联通性显然用的是并查集.

#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一遍...然后就出现了奇异的景象:

Submit 1737
User(Submit) 735
User(Solved) 702
AC 871
WA 460
TLE 196
MLE 3
OLE 6
RE 143
CE 58
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
AC[50%]
 
WA[26%]
 
TLE[11%]
 
MLE[0%]
 
OLE[0%]
 
RE[8%]
 
CE[3%]
No. RunID User Memory Time Language Code_Length Submit_Time
241 546203 absi2011 1468 KB 1076 MS C++ 2608 B 2014-02-14 16:51:06
242 695809 zhengly123 1824 KB 1076 MS C++ 1730 B 2014-07-15 14:58:06
243 473121 sth1997 864 KB 1088 MS C++ 1321 B 2013-08-29 10:59:59
244 967344(2) tmzbot 20616 KB 1116 MS C++ 1311 B 2015-05-08 14:26:09
245 312288 Maigo 1352 KB 1144 MS C++ 1060 B 2012-10-06 16:16:30
246 234103 Oct_Gap201 372 KB 1152 MS Pascal 4710 B 2012-03-27 16:40:05
247 786906 Nano_Ape 1480 KB 1152 MS C++ 1705 B 2014-11-26 14:35:22
248 6697(2) Sachs 700 KB 1153 MS Pascal 2155 B 2009-09-09 18:39:30
249 221303 TSZWL 368 KB 1156 MS Pascal 4662 B 2012-03-10 16:07:32
250 244488(2) bill125 368 KB 1156 MS Pascal 4662 B 2012-04-16 23:08:22
251 214563(2) sbsbsbsb 368 KB 1160 MS Pascal 4670 B 2012-02-28 21:34:20
252 197945 This_poet 1396 KB 1168 MS C++ 1564 B 2012-02-01 17:13:54
253 67605 nathenqian 268 KB 1183 MS C++ 1737 B 2010-12-11 14:49:13
254 68313 cfttcc 860 KB 1183 MS Pascal 1751 B 2010-12-14 13:33:07
255 75681 crfish 600 KB 1184 MS Pascal 1662 B 2011-02-25 23:25:16
256 29182 wu3412790 620 KB 1184 MS Pascal 1381 B 2010-06-11 17:00:14
257 661385 RealCS 1396 KB 1188 MS C++ 1560 B 2014-05-30 15:37:42
258 12275 thegreysky 320 KB 1199 MS C++ 1523 B 2010-03-09 22:25:46
259 6500 zr_1234 684 KB 1201 MS Pascal 1957 B 2009-09-01 18:26:15
260 460098 Ruchiose 1332 KB 1212 MS C++ 2924 B 2013-08-02 17:20:09

[TOP]  [STATUS]  [PREV]  [NEXT]

2W多KB的那个SB就是我.

BZOJ1050 [HAOI2006]旅行的更多相关文章

  1. BZOJ1050 HAOI2006旅行(最小生成树+LCT)

    暴力枚举路径中权值最小边是哪个,然后求出边权不小于它的边的最小生成树,即可保证该路径上最大值最小.暴力当然可以过,这里使用LCT维护.注意数据中有自环. #include<iostream> ...

  2. bzoj1050: [HAOI2006]旅行comf

    Description 给你一个无向图,N(N<=500)个顶点, M(M<=5000)条边,每条边有一个权值Vi(Vi<30000).给你两个顶点S和T,求一条路径,使得路径上最大 ...

  3. [BZOJ1050] [HAOI2006] 旅行comf (Kruskal, LCT)

    Description 给你一个无向图,N(N<=500)个顶点, M(M<=5000)条边,每条边有一个权值Vi(Vi<30000).给你两个顶点S和T,求一条路径,使得路径上最大 ...

  4. bzoj1050[HAOI2006]旅行comf(枚举+贪心+并查集)

    Description 给你一个无向图,N(N<=500)个顶点, M(M<=5000)条边,每条边有一个权值Vi(Vi<30000).给你两个顶点S和T,求一条路径,使得路径上最大 ...

  5. BZOJ1050: [HAOI2006]旅行comf(并查集 最小生成树)

    Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 4021  Solved: 2257[Submit][Status][Discuss] Descript ...

  6. [BZOJ1050][HAOI2006]旅行comf 枚举+并查集

    题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1050 将边排序,枚举边权最小的边,依次加边直到S和T连通,更新答案. #include&l ...

  7. [bzoj1050 HAOI2006] 旅行comf (kruskal)

    传送门 Description 给你一个无向图,N(N<=500)个顶点, M(M<=5000)条边,每条边有一个权值Vi(Vi<30000).给你两个顶点S和T,求 一条路径,使得 ...

  8. BZOJ1050 [HAOI2006]旅行comf[并查集判图连通性]

    ★ Description 给你一个无向图,N(N<=500)个顶点, M(M<=5000)条边,每条边有一个权值Vi(Vi<30000).给你两个顶点S和T,求 一条路径,使得路径 ...

  9. 【BZOJ1050】[HAOI2006]旅行

    [BZOJ1050][HAOI2006]旅行 题面 bzoj 洛谷 题解 先将所有边从小往大排序 枚举钦定一条最小边 再枚举依次枚举最大边,如果两个点联通了就\(break\)统计答案即可 代码 #i ...

随机推荐

  1. java.lang.IllegalStateException: getWriter() has already been called for this response问题解决

    java.lang.IllegalStateException: getWriter() has already been called for this response问题解决 java.lang ...

  2. nginx 配置虚拟主机

    文章转载自:http://www.ttlsa.com/html/1571.html 上篇说道我们的nginx是安装在/usr/local/nginx/ cd conf 我们现在把所有的虚拟主机放在一个 ...

  3. nginx下禁止访问robots.txt的设置方法

    关于robots.txt文件:搜索引擎通过一种程序robot(又称spider),自动访问互联网上的网页并获取网页信 息.您可以在您的网站中创建一个纯文本文件robots.txt,在这个文件中声明该网 ...

  4. VS插件之小番茄

    文件源以及安装说明! http://www.youranshare.com/app/98.html

  5. .net架构设计读书笔记--第三章 第10节 命令职责分离(CQRS)简介(Introducing CQRS)

    一.分离查询命令 Separating commands from queries     早期的面向DDD设计方法的难点是如何设计一个类,这个类要包含域的方方面面.通常来说,任务软件系统方法调用可以 ...

  6. 修改mysql最大连接数的方法

    MYSQL数据库安装完成后,默认最大连接数是100,一般流量稍微大一点的论坛或网站这个连接数是远远不够的,增加默认MYSQL连接数的方法有两个 方法一:进入MYSQL安装目录 打开MYSQL配置文件 ...

  7. Informatica 错误:Cannot convert from SQL type 93 to C type 4

    经验和积累蛮重要!向大神学习! ---------------------------------------------------------------------- Mapping: 在sou ...

  8. 39.Android版本小知识

    中文名----英文名----版本----对应API Level 棉花糖 Marshmallow - 6.0.1_r10 - API 23棉花糖 Marshmallow - 6.0.0_r5 - API ...

  9. 【BZOJ-2434】阿狸的打字机 AC自动机 + Fail树 + DFS序 + 树状数组

    2434: [Noi2011]阿狸的打字机 Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 2022  Solved: 1158[Submit][Sta ...

  10. 【bzoj2823】 AHOI2012—信号塔

    http://www.lydsy.com/JudgeOnline/problem.php?id=2823 (题目链接) 题意 求最小圆覆盖 Solution 关于最小圆覆盖的做法,论文里面都有.其实真 ...