BZOJ1050 旅行comf [kruskal]

来源:互联网 发布:linux改名命令 编辑:程序博客网 时间:2024/06/05 11:12

最小生成树的模板题,有点暴力。。。枚举生成树上的边,求MAX与MIN。

#include<cstdio>#include<cstring>#include<iostream>#include<algorithm>using namespace std;const int N = 100005;template<class T>inline void read(T &res){    static char ch;T flag=1;    while((ch=getchar())<'0'||ch>'9')if(ch=='-')flag=-1;res=ch-48;    while((ch=getchar())>='0'&&ch<='9')res=res*10+ch-48;res*=flag;}struct data{    int x,y,w;    inline bool operator < (const data &rhs)const{        return w<rhs.w;    }}E[N];int tot,n,m,a,b,T,S,f,minn,maxn,fa[N];double ans=1e100;int find(int x){    return x==fa[x]?x:fa[x]=find(fa[x]);}void addedge(int x,int y,int z){    E[++tot].x=x,E[tot].y=y,E[tot].w=z;}int gcd(int a,int b){    return b==0?a:gcd(b,a%b);}int main(){    read(n),read(m);    for(register int x,y,z,i=1;i<=m;++i)read(x),read(y),read(z),addedge(x,y,z);    read(S),read(T);    sort(E+1,E+1+m);    for(register int i=1,j;i<=m;i++){        for(j=1;j<=n;j++)fa[j]=j;        for(j=i;j<=m;j++){            if (find(E[j].x)!=find(E[j].y))fa[find(E[j].x)]=find(E[j].y);            else continue;            if(find(S)==find(T)) break;        }        if(find(S)!=find(T))break;        if((double)E[j].w/E[i].w<ans)minn=E[i].w,maxn=E[j].w,ans=(double)maxn/minn;    }    if(ans==1e100){printf("IMPOSSIBLE\n");return 0;}    int tmp=gcd(minn,maxn);minn/=tmp,maxn/=tmp;    if(minn==1)printf("%d\n",maxn);    else printf("%d/%d\n",maxn,minn);    return 0;}

这里写图片描述