zoukankan      html  css  js  c++  java
  • [HAOI2006]旅行 题解(kruskal)

    [HAOI2006]旅行

    Description

    Z小镇是一个景色宜人的地方,吸引来自各地的观光客来此旅游观光。Z小镇附近共有N个景点(编号为1,2,3,…,N),这些景点被M条道路连接着,所有道路都是双向的,两个景点之间可能有多条道路。也许是为了保护该地的旅游资源,Z小镇有个奇怪的规定,就是对于一条给定的公路Ri,任何在该公路上行驶的车辆速度必须为Vi。速度变化太快使得游客们很不舒服,因此从一个景点前往另一个景点的时候,大家都希望选择行使过程中最大速度和最小速度的比尽可能小的路线,也就是所谓最舒适的路线。

    输入格式:
    第一行包含两个正整数,N和M。
    接下来的M行每行包含三个正整数:x,y和v。表示景点x到景点y之间有一条双向公路,车辆必须以速度v在该公路上行驶。
    最后一行包含两个正整数s,t,表示想知道从景点s到景点t最大最小速度比最小的路径。s和t不可能相同。

    输出格式:如果景点s到景点t没有路径,输出“IMPOSSIBLE”。否则输出一个数,表示最小的速度比。如果需要,输出一个既约分数。

    Solution

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<cmath>
    #include<algorithm>
    using namespace std;
    
    struct rode{
    	int x,y,w;
    }r[10010];
    int n,m,i,j,k,s,t,f[1010]; 
    
    inline int rd(){
    	int x=0;
    	bool f=1;
    	char c=getchar();
    	while(!isdigit(c)){
    		if(c=='-') f=0;
    		c=getchar();
    	}
    	while(isdigit(c)){
    		x=(x<<1)+(x<<3)+(c^48);
    		c=getchar();
    	}
    	return f?x:-x;
    }
    
    int gcd(int a,int b){return b?gcd(b,a%b):a;}
    
    int find(int x){
    	if(x==f[x])return x;
    	return f[x]=find(f[x]);
    }
    
    void merge(int x,int y){
    	f[find(x)]=find(y);
    }
    
    bool judge(int x,int y){
    	if(find(x)==find(y))return true;
    	return false;
    }
    
    bool cmp(rode x,rode y){
    	return x.w<y.w;	
    }
    
    int main(){
    	int nowmin=1,nowmax=0x7f7f7f7f;
    	double ans=2147483647;
    	n=rd();
    	m=rd();
    	for(i=1;i<=m;++i){
    		r[i].x=rd();
    		r[i].y=rd();
    		r[i].w=rd();
    	}
    	s=rd();
    	t=rd();
    	sort(r+1,r+1+m,cmp);
    	for(j=1;j<=m;++j){
    		bool flag=0;
    		int minn;
    		for(i=1;i<=n;++i)f[i]=i;
    		for(i=j;i<=m;++i){
    			if(!judge(r[i].x,r[i].y))merge(r[i].x,r[i].y);
    			if(judge(s,t))break;
    		}
    		if(judge(s,t)){
    			if((double)((double)r[i].w/(double)r[j].w)<(double)((double)nowmax/(double)nowmin)){
    				nowmin=r[j].w;
    				nowmax=r[i].w;
    			}
    		}
    	}
    	if(nowmax==0x7f7f7f7f)printf("IMPOSSIBLE
    ");
    	else{
    		int temp=gcd(nowmin,nowmax);
    		if(temp==nowmin) printf("%d
    ",nowmax/nowmin);
    		else printf("%d/%d",nowmax/temp,nowmin/temp);
    	}
    	return 0;
    }
    
  • 相关阅读:
    Python-TXT文本操作
    Appium-处理系统弹窗
    Appium-服务关键字
    App Inspector-iOS真机功能详解
    Appium+Python3+iOS真机环境搭建
    Appium-超过60s的应用场景如何处理
    python-入门的第一个爬虫例子
    Mysql(五) JDBC
    Mysql(四)正则表达式
    Mysql(三)约束
  • 原文地址:https://www.cnblogs.com/COLIN-LIGHTNING/p/8684011.html
Copyright © 2011-2022 走看看