Bzoj1050 AHOI2006旅行 并查集

来源:互联网 发布:java实现arp欺骗 编辑:程序博客网 时间:2024/04/29 00:48

比较简单的题目

就是在无向图上求一条st的路使得最大权和最小权的比值min


因为数据范围不大所以直接暴力就可以过

只需要按边权排序然后依次加入并查集维护连通性就可以了

#include<iostream>#include<cstring>#include<cstdio>#include<algorithm>#define rep(i,j,k) for(int i=j;i<=k;i++)#define MAX 5009using namespace std;int father[MAX];int n,m,s,t;struct wbysr{int num,value;int from,to;}d[MAX];void add(int num,int from,int To,int weight){d[num].value=weight;d[num].from=from;d[num].to=To;}int find(int x){if(father[x]==x)return x;father[x]=find(father[x]);return father[x];}void Union(int x,int y){int a1=find(x),a2=find(y);if(a1!=a2)father[a1]=a2;return;}int gcd(int x,int y){if(!y)return x;return gcd(y,x%y);}bool cmp(wbysr a1,wbysr a2){return a1.value<a2.value;}int main(){scanf("%d%d",&n,&m);rep(i,1,m){int a1,a2,a3;scanf("%d%d%d",&a1,&a2,&a3);add(i,a1,a2,a3);}scanf("%d%d",&s,&t);sort(d+1,d+1+m,cmp);rep(i,1,n)father[i]=i;int ans1=999999,ans2=1;rep(i,1,m){rep(i,1,n)father[i]=i;for(int j=i;j<=m;j++){Union(d[j].from,d[j].to);if(find(s)==find(t)){if(ans2*d[j].value<ans1*d[i].value)ans1=d[j].value,ans2=d[i].value;break;}}}if(999999==ans1)printf("IMPOSSIBLE\n");else{int u=gcd(ans1,ans2);if(ans2==u)printf("%d\n",ans1/u);elseprintf("%d/%d\n",ans1/u,ans2/u);}return 0;}

0 0