[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;
}
并不会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;
}
相关文章推荐
- bzoj1050 [HAOI2006]旅行comf
- [BZOJ1050][HAOI2006]旅行comf(图论)
- 【BZOJ 1050】1050: [HAOI2006]旅行comf (动态SPFA)
- [BZOJ1050][HAOI2006]旅行comf(并查集)
- bzoj1050:[HAOI2006]旅行comf
- bzoj 1050: [HAOI2006] 旅行comf
- 【bzoj1050】[HAOI2006]旅行comf
- BZOJ 1050 [HAOI2006]旅行comf
- bzoj 1050 [HAOI2006]旅行comf (最小生成树)
- BZOJ 1050: [HAOI2006]旅行comf (并查集 或 单调队列)
- BZOJ1050: [HAOI2006]旅行comf
- BZOJ 1050: [HAOI2006]旅行comf|动点spfa
- bzoj 1050: [HAOI2006]旅行comf【枚举+并查集】
- 【bzoj 1050】 [HAOI2006]旅行comf
- 【bzoj1050】[HAOI2006]旅行comf 并查集
- BZOJ 1050: [HAOI2006]旅行comf 贪心,并查集
- BZOJ 1050 [HAOI2006]旅行comf
- BZOJ 1050 1050 [HAOI2006]旅行comf
- BZOJ1050 [HAOI2006]旅行comf
- bzoj 1050: [HAOI2006]旅行comf 并查集