• 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
    ",FA1); else printf("%d/%d
    ",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
    ");
    			return 0;
    		}
    	}
    	if(FB1==1) printf("%d
    ",FA1); else printf("%d/%d
    ",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就是我.

  • 相关阅读:
    司马光 王安石
    辛弃疾
    伯仲叔季
    三国时代
    西汉 东汉 三国(曹魏 蜀汉 东吴)
    数量关系练习题
    为什么不推荐使用外键约束
    Google Map API申请
    Android传感器——加速度传感器
    第三届空间信息智能服务研讨会
  • 原文地址:https://www.cnblogs.com/tmzbot/p/4487593.html
Copyright © 2020-2023  润新知