zoukankan      html  css  js  c++  java
  • bzoj 1050: [HAOI2006]旅行comf【枚举+并查集】

    m是5000,就想到了直接枚举比例
    具体做法是是先把边按照边权从小到大排序,然后先枚举最小边权,再枚举最大边权,就是从最小边权里一个一个加进并查集里,每次查st是否联通,联通则退出,更新答案

    #include<iostream>
    #include<cstdio>
    #include<algorithm>
    using namespace std;
    const int N=5005;
    int n,m,f[N],s,t;
    double ax=30001,ay=1;
    struct qwe
    {
    	int u,v;
    	double w;
    }a[N];
    bool cmp(const qwe &a,const qwe &b)
    {
    	return a.w<b.w;
    }
    int read()
    {
    	int r=0,f=1;
    	char p=getchar();
    	while(p>'9'||p<'0')
    	{
    		if(p=='-')
    			f=-1;
    		p=getchar();
    	}
    	while(p>='0'&&p<='9')
    	{
    		r=r*10+p-48;
    		p=getchar();
    	}
    	return r*f;
    }
    int zhao(int x)
    {
    	return x==f[x]?x:f[x]=zhao(f[x]);
    }
    int gcd(int a,int b)
    {
    	return !b?a:gcd(b,a%b);
    }
    int main()
    {
    	n=read(),m=read();
    	for(int i=1;i<=m;i++)
    		a[i].u=read(),a[i].v=read(),a[i].w=read();
    	s=read(),t=read();
    	sort(a+1,a+1+m,cmp);
    	for(int i=1;i<=m;i++)
    	{
    		for(int j=1;j<=n;j++)
    			f[j]=j;
    		for(int j=i;j<=m;j++)
    		{
    			int fu=zhao(a[j].u),fv=zhao(a[j].v);
    			if(fu!=fv)
    			{
    				f[fu]=fv;
    				if(zhao(s)==zhao(t))
    				{//cerr<<a[j].w<<" "<<a[i].w<<endl;
    					if(ax/ay>a[j].w/a[i].w)
    						ax=a[j].w,ay=a[i].w;
    					break;
    				}
    			}
    		}
    	}
    	if(ax==30001)
    		puts("IMPOSSIBLE");
    	else
    	{
    		int d=gcd(ax,ay);
    		if(d==ay)
    			printf("%d
    ",(int)ax/d);
    		else
    			printf("%d/%d
    ",(int)ax/d,(int)ay/d);
    	}
    	return 0;
    }
    
  • 相关阅读:
    Web 服务器配置
    Web 浏览
    C++ Web 编程
    C++ 多线程
    C++ 信号处理
    C++ 预处理器
    C++ 模板
    C++ 命名空间
    C++ 动态内存
    C++ 异常处理
  • 原文地址:https://www.cnblogs.com/lokiii/p/9384256.html
Copyright © 2011-2022 走看看