您的位置:首页 > 其它

[BZOJ 1050] HAOI 2006 旅行comf · Kruskal

2017-07-25 16:20 309 查看
网上有非常吊炸天的LCT做法

并不会23333

用Kruskal来做的思路比较神奇但是很简单

首先把所有的边按照权值排序

顺次枚举每一条边,从这条边开始做Kruskal,直到S和T联通,这就是一个可行解,然后判断出分数最小的一个解 复杂度O(M^2)

与普通的kruskal代码略有不同,条件稍加修改

#include <cstdio>
#include <algorithm>
#include <cstring>
#include <cmath>
using namespace std;
#define f(i,x,y) for (int i=x;i<=y;i++)

const int N=5005;
struct arr{
int x,y,t;
}a
;
int n,m,ans1,ans2,S,T,f
;

bool cmp(const arr A,const arr B){
return A.t<B.t;
}

int get(int x){
if (f[x]==x) return x;
return f[x]=get(f[x]);
}

int gcd(int x,int y) {
return !y?x:gcd(y,x%y);
}

int main(){
scanf("%d%d",&n,&m);
f(i,1,m)scanf("%d%d%d",&a[i].x,&a[i].y,&a[i].t);
sort(a+1,a+m+1,cmp);
scanf("%d%d",&S,&T);

f(j,1,m) {
int tmp1=0,tmp2=0;
if (a[j].t==a[j-1].t) continue;
f(i,1,n) f[i]=i;
f(i,j,m){
int fx=get(a[i].x),fy=get(a[i].y);
if (fx!=fy)
f[fx]=fy,
tmp2=a[i].t;

if (get(S)==get(T)) break;
}
if (f[S]==f[T]){
tmp1=a[j].t;
if (!ans1 || tmp2*ans1<tmp1*ans2) ans1=tmp1,ans2=tmp2;
}
}
if (!ans1) printf("IMPOSSIBLE");
else{
int p=gcd(ans1,ans2);
ans1/=p;ans2/=p;
if (ans1==1) printf("%d",ans2);
else printf("%d/%d",ans2,ans1);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: